Remove ppp_types0.py
It is just an old version of ppp_types.py, before I probably rewrote the way types worked.
This commit is contained in:
		
							parent
							
								
									9b960e3ecf
								
							
						
					
					
						commit
						659c79373d
					
				
							
								
								
									
										180
									
								
								ppp_types0.py
									
									
									
									
									
								
							
							
						
						
									
										180
									
								
								ppp_types0.py
									
									
									
									
									
								
							@ -1,180 +0,0 @@
 | 
			
		||||
from dataclasses import dataclass
 | 
			
		||||
from types import EllipsisType
 | 
			
		||||
from typing import Dict, Optional, Union as Union_, Tuple as Tuple_, List as List_
 | 
			
		||||
 | 
			
		||||
@dataclass
 | 
			
		||||
class StructContents:
 | 
			
		||||
	generics: 'List_[Type]'
 | 
			
		||||
	members: 'Dict[str, Type]'
 | 
			
		||||
 | 
			
		||||
@dataclass
 | 
			
		||||
class TupleContents:
 | 
			
		||||
	elements: 'List_[Type]'
 | 
			
		||||
 | 
			
		||||
@dataclass
 | 
			
		||||
class EnumContents:
 | 
			
		||||
	generics: 'List_[Type]'
 | 
			
		||||
	members: 'Dict[str, Union_[Dict[str, Type], List_[Type]]]'
 | 
			
		||||
 | 
			
		||||
@dataclass
 | 
			
		||||
class UnknownContents:
 | 
			
		||||
	pass
 | 
			
		||||
 | 
			
		||||
@dataclass
 | 
			
		||||
class FunctionContents:
 | 
			
		||||
	arguments: 'List_[Type]'
 | 
			
		||||
	return_type: 'Type'
 | 
			
		||||
 | 
			
		||||
@dataclass
 | 
			
		||||
class ListContents:
 | 
			
		||||
	type: 'Optional[Type]'
 | 
			
		||||
 | 
			
		||||
@dataclass
 | 
			
		||||
class UnionContents:
 | 
			
		||||
	types: 'List_[Type]'
 | 
			
		||||
 | 
			
		||||
@dataclass
 | 
			
		||||
class Type:
 | 
			
		||||
	name: str
 | 
			
		||||
	contents: Union_[EnumContents, StructContents, TupleContents, FunctionContents, ListContents, UnknownContents, UnionContents]
 | 
			
		||||
 | 
			
		||||
	def specify(self, *types: 'Type') -> 'Type':
 | 
			
		||||
		assert False, ("Unimplemented")
 | 
			
		||||
	
 | 
			
		||||
	def is_subtype_of(self, other: 'Type') -> bool: # TODO: Maybe return any generics that match
 | 
			
		||||
		if other.name == 'object': return True
 | 
			
		||||
		match self.contents, other.contents:
 | 
			
		||||
			case (EnumContents(self_members), EnumContents(other_members)) | (StructContents(self_members), StructContents(other_members)):
 | 
			
		||||
				return self.name == other.name
 | 
			
		||||
			case TupleContents(self_elements), TupleContents(other_elements):
 | 
			
		||||
				if self.name != other.name: return False
 | 
			
		||||
				if len(self_elements) != len(other_elements): return False
 | 
			
		||||
				for (self_element, other_element) in zip(self_elements, other_elements):
 | 
			
		||||
					if not self_element.is_subtype_of(other_element): return False
 | 
			
		||||
				return True
 | 
			
		||||
			case FunctionContents(self_arguments, self_return_type), FunctionContents(other_arguments, other_return_type):
 | 
			
		||||
				for (self_argument, other_argument) in zip(self_arguments, other_arguments):
 | 
			
		||||
					if not other_argument.is_subtype_of(self_argument): return False
 | 
			
		||||
				return self_return_type.is_subtype_of(other_return_type)
 | 
			
		||||
			case ListContents(self_type), ListContents(other_type):
 | 
			
		||||
				if self_type is None: return True
 | 
			
		||||
				if other_type is None: return True
 | 
			
		||||
				return self_type.is_subtype_of(other_type)
 | 
			
		||||
			case UnionContents(self_types), UnionContents(other_types):
 | 
			
		||||
				for type_ in self_types:
 | 
			
		||||
					if not type_.is_subtype_of(other): return False
 | 
			
		||||
				return True
 | 
			
		||||
			case a, b if type(a) == type(b):
 | 
			
		||||
				assert False, ("Unimplemented", self, other)
 | 
			
		||||
			case _, UnionContents(types):
 | 
			
		||||
				for type_ in types:
 | 
			
		||||
					if self.is_subtype_of(type_): return True
 | 
			
		||||
				return False
 | 
			
		||||
			case _, _:
 | 
			
		||||
				return False
 | 
			
		||||
		assert False, ("Unimplemented")
 | 
			
		||||
 | 
			
		||||
	def fill(self, types: 'Dict[str, Type]') -> 'Type':
 | 
			
		||||
		match self.contents:
 | 
			
		||||
			case TupleContents(elements):
 | 
			
		||||
				return Type(self.name, TupleContents([type.fill(types) for type in elements]))
 | 
			
		||||
			case EnumContents(generics, members):
 | 
			
		||||
				assert not generics # TODO
 | 
			
		||||
 | 
			
		||||
				new_members: Dict[str, Union_[Dict[str, Type], List_[Type]]] = {}
 | 
			
		||||
				for name in members:
 | 
			
		||||
					member = members[name]
 | 
			
		||||
					if isinstance(member, list):
 | 
			
		||||
						new_members[name] = [type.fill(types) for type in member]
 | 
			
		||||
					elif isinstance(member, dict):
 | 
			
		||||
						new_members[name] = {field: member[field].fill(types) for field in member}
 | 
			
		||||
					else:
 | 
			
		||||
						assert False, "Unreachable"
 | 
			
		||||
					
 | 
			
		||||
				return Type(self.name, EnumContents(generics, new_members))
 | 
			
		||||
			case StructContents(generics, members):
 | 
			
		||||
				assert not generics # TODO
 | 
			
		||||
				return Type(self.name, StructContents(generics, {field: members[field].fill(types) for field in members}))
 | 
			
		||||
			case ListContents(type):
 | 
			
		||||
				return Type(self.name, ListContents(type.fill(types) if type else None))
 | 
			
		||||
			case UnknownContents():
 | 
			
		||||
				return types[self.name] if self.name in types else self
 | 
			
		||||
			case UnionContents(types_):
 | 
			
		||||
				return Type(self.name, UnionContents([type.fill(types) for type in types_]))
 | 
			
		||||
			case FunctionContents(arguments, return_type):
 | 
			
		||||
				return Type(self.name, FunctionContents([argument.fill(types) for argument in arguments], return_type.fill(types)))
 | 
			
		||||
			case _:
 | 
			
		||||
				assert False, ("Unimplemented", self.contents)
 | 
			
		||||
		assert False, "Unreachable"
 | 
			
		||||
 | 
			
		||||
	def represent(self) -> str:
 | 
			
		||||
		match self.contents:
 | 
			
		||||
			case EnumContents(generics, _) | StructContents(generics, _): return self.name + ("<"+', '.join([generic.represent() for generic in generics])+">" if generics else '')
 | 
			
		||||
			case TupleContents(elements):  return (self.name if self.name != "tuple" else '') + ('('+', '.join([generic.represent() for generic in elements])+')' if elements else '')
 | 
			
		||||
			case ListContents(type): return (type.represent() if type else '')+'[]'
 | 
			
		||||
			case UnknownContents(): return self.name+"?"
 | 
			
		||||
			case UnionContents(types): return '('+'|'.join([type.represent() for type in types])+')'
 | 
			
		||||
			case FunctionContents(arguments, return_type): return "("+', '.join([type.represent() for type in arguments])+") -> "+return_type.represent()
 | 
			
		||||
		assert False, ("Unimplemented")
 | 
			
		||||
 | 
			
		||||
	def __eq__(self, other) -> bool:
 | 
			
		||||
		return isinstance(other, Type) and self.is_subtype_of(other) and other.is_subtype_of(self)
 | 
			
		||||
	
 | 
			
		||||
	def __repr__(self) -> str:
 | 
			
		||||
		try:
 | 
			
		||||
			return self.represent()
 | 
			
		||||
		except AssertionError:
 | 
			
		||||
			return f"Unimplemented {self.contents.__class__.__name__}"
 | 
			
		||||
 | 
			
		||||
def primitive(name: str) -> Type: return Type(name, TupleContents([]))
 | 
			
		||||
Int = primitive("int")
 | 
			
		||||
Str = primitive("str")
 | 
			
		||||
Bool = primitive("bool")
 | 
			
		||||
Void = primitive("void")
 | 
			
		||||
TypeType = primitive("type")
 | 
			
		||||
 | 
			
		||||
def Tuple(*types: Type) -> Type: return Type("tuple", TupleContents(list(types)))
 | 
			
		||||
def List(type: Optional[Type]=None) -> Type: return Type("list", ListContents(type))
 | 
			
		||||
 | 
			
		||||
def Function(*arguments_and_return_type: Type) -> Type:
 | 
			
		||||
	assert arguments_and_return_type, "Must have a return value"
 | 
			
		||||
	return Type("function", FunctionContents(list(arguments_and_return_type[:-1]), arguments_and_return_type[-1]))
 | 
			
		||||
 | 
			
		||||
Unit = Tuple()
 | 
			
		||||
 | 
			
		||||
def Union(*types: Type) -> Type: return Type("union", UnionContents(list(types)))
 | 
			
		||||
def Return(type: Type) -> Type:
 | 
			
		||||
	return Type('return', StructContents([type], {'value': type}))
 | 
			
		||||
 | 
			
		||||
Object = primitive('object')
 | 
			
		||||
 | 
			
		||||
# TODO: struct enum members
 | 
			
		||||
def EnumMember(enum_type: Type, *types: Type) -> Type: return Type('enum_tuple_member', FunctionContents(list(types), enum_type))
 | 
			
		||||
 | 
			
		||||
# def issubclassof(type1: Type, type2: Type) -> bool:
 | 
			
		||||
# 	if type1.name != 'union' and type2.name == 'union':
 | 
			
		||||
# 		return type1 in type2.generics
 | 
			
		||||
# 	if type1.name != type2.name: return False
 | 
			
		||||
# 	if not type2.generics: return True
 | 
			
		||||
# 	if len(type1.generics) != len(type2.generics): return False
 | 
			
		||||
# 	if type1.name == '->':
 | 
			
		||||
# 		for (type_a, type_b) in zip(type1.generics[:-1], type2.generics[:-1]):
 | 
			
		||||
# 			if not issubclassof(type_b, type_a): return False
 | 
			
		||||
# 		return issubclassof(type1.generics[-1], type2.generics[-1])
 | 
			
		||||
# 	if type1.name == 'union': assert False, ("Unimplemented", type1, type2)
 | 
			
		||||
# 	if type1.name == 'tuple': return all([issubclassof(type_a, type_b) for (type_a, type_b) in zip(type1.generics, type2.generics)])
 | 
			
		||||
# 	assert False, ("Unimplemented", type1, type2)
 | 
			
		||||
 | 
			
		||||
# Void = Type('void', TupleContents([]))
 | 
			
		||||
# AbstractFunction = Type('->', [])
 | 
			
		||||
# def Function(*arguments_and_return_type: Type) -> Type:
 | 
			
		||||
# 	assert arguments_and_return_type, "Must have a return value"
 | 
			
		||||
# 	return AbstractFunction.specify(*arguments_and_return_type)
 | 
			
		||||
 | 
			
		||||
# Int = Type('int', [], False)
 | 
			
		||||
# String = Type('str', [], False)
 | 
			
		||||
# Bool = Type('bool', [], False)
 | 
			
		||||
# def List(type: Type) -> Type: return Type('list', [type])
 | 
			
		||||
 | 
			
		||||
# Unit = Type('unit', [], False)
 | 
			
		||||
# def Tuple(*types: Type) -> Type: return Type('tuple', list(types)) if types else Unit
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user