Allow library __setitem__ to take in either Pattern or Callable
No longer need it to be Generic!
This commit is contained in:
		
							parent
							
								
									963918d1d9
								
							
						
					
					
						commit
						c0e4ee1b6b
					
				| @ -532,7 +532,7 @@ class Builder(PortList): | ||||
|         in_ptype = self.pattern[portspec].ptype | ||||
|         pat = tool.path(ccw, length, in_ptype=in_ptype, port_names=tool_port_names, **kwargs) | ||||
|         name = self.library.get_name(base_name) | ||||
|         self.library.set_const(name, pat) | ||||
|         self.library[name] = pat | ||||
|         return self.plug(Abstract(name, pat.ports), {portspec: tool_port_names[0]}) | ||||
| 
 | ||||
|     def path_to( | ||||
| @ -615,7 +615,7 @@ class Builder(PortList): | ||||
|             for port_name, length in extensions.items(): | ||||
|                 bld.path(port_name, ccw, length, tool_port_names=tool_port_names) | ||||
|             name = self.library.get_name(base_name) | ||||
|             self.library.set_const(name, bld.pattern) | ||||
|             self.library[name] = bld.pattern | ||||
|             return self.plug(Abstract(name, bld.pattern.ports), {sp: 'in_' + sp for sp in ports.keys()})       # TODO safe to use 'in_'? | ||||
| 
 | ||||
|     # TODO def path_join() and def bus_join()? | ||||
|  | ||||
| @ -5,7 +5,7 @@ Library classes for managing unique name->pattern mappings and | ||||
| # TODO documentn all library classes | ||||
| # TODO toplevel documentation of library, classes, and abstracts | ||||
| """ | ||||
| from typing import List, Dict, Callable, TypeVar, Generic, Type, TYPE_CHECKING, cast | ||||
| from typing import List, Dict, Callable, TypeVar, Type, TYPE_CHECKING, cast | ||||
| from typing import Tuple, Union, Iterator, Mapping, MutableMapping, Set, Optional, Sequence | ||||
| import logging | ||||
| import base64 | ||||
| @ -403,32 +403,29 @@ class Library(Mapping[str, 'Pattern'], metaclass=ABCMeta): | ||||
|                 raise LibraryError('visit_* functions returned a new `Pattern` object' | ||||
|                                    ' but no top-level name was provided in `hierarchy`') | ||||
| 
 | ||||
|             cast(MutableLibrary, self).set_const(name, pattern) | ||||
|             cast(MutableLibrary, self)[name] = pattern | ||||
| 
 | ||||
|         return self | ||||
| 
 | ||||
| 
 | ||||
| VVV = TypeVar('VVV') | ||||
| 
 | ||||
| 
 | ||||
| class MutableLibrary(Library, Generic[VVV], metaclass=ABCMeta): | ||||
| class MutableLibrary(Library, MutableMapping[str, 'Pattern'], metaclass=ABCMeta): | ||||
|     # inherited abstract functions | ||||
|     #def __getitem__(self, key: str) -> 'Pattern': | ||||
|     #def __iter__(self) -> Iterator[str]: | ||||
|     #def __len__(self) -> int: | ||||
| 
 | ||||
|     @abstractmethod | ||||
|     def __setitem__(self, key: str, value: VVV) -> None: | ||||
|     def __setitem__( | ||||
|             self, | ||||
|             key: str, | ||||
|             value: Union['Pattern', Callable[[], 'Pattern']], | ||||
|             ) -> None: | ||||
|         pass | ||||
| 
 | ||||
|     @abstractmethod | ||||
|     def __delitem__(self, key: str) -> None: | ||||
|         pass | ||||
| 
 | ||||
|     @abstractmethod | ||||
|     def set_const(self, key: str, value: 'Pattern') -> None: | ||||
|         pass | ||||
| 
 | ||||
|     @abstractmethod | ||||
|     def _merge(self, other: Mapping[str, 'Pattern'], key: str) -> None: | ||||
|         pass | ||||
| @ -566,7 +563,7 @@ class MutableLibrary(Library, Generic[VVV], metaclass=ABCMeta): | ||||
|                 del pat.shapes[i] | ||||
| 
 | ||||
|         for ll, pp in shape_pats.items(): | ||||
|             self.set_const(label2name(ll), pp) | ||||
|             self[label2name(ll)] = pp | ||||
| 
 | ||||
|         return self | ||||
| 
 | ||||
| @ -601,7 +598,7 @@ class MutableLibrary(Library, Generic[VVV], metaclass=ABCMeta): | ||||
|                     continue | ||||
| 
 | ||||
|                 name = name_func(pat, shape) | ||||
|                 self.set_const(name, Pattern(shapes=[shape])) | ||||
|                 self[name] = Pattern(shapes=[shape]) | ||||
|                 pat.ref(name, repetition=shape.repetition) | ||||
|                 shape.repetition = None | ||||
|             pat.shapes = new_shapes | ||||
| @ -612,7 +609,7 @@ class MutableLibrary(Library, Generic[VVV], metaclass=ABCMeta): | ||||
|                     new_labels.append(label) | ||||
|                     continue | ||||
|                 name = name_func(pat, label) | ||||
|                 self.set_const(name, Pattern(labels=[label])) | ||||
|                 self[name] = Pattern(labels=[label]) | ||||
|                 pat.ref(name, repetition=label.repetition) | ||||
|                 label.repetition = None | ||||
|             pat.labels = new_labels | ||||
| @ -688,15 +685,23 @@ class WrapLibrary(MutableLibrary): | ||||
|     def __len__(self) -> int: | ||||
|         return len(self.mapping) | ||||
| 
 | ||||
|     def __setitem__(self, key: str, value: 'Pattern') -> None: | ||||
|     def __setitem__( | ||||
|             self, | ||||
|             key: str, | ||||
|             value: Union['Pattern', Callable[[], 'Pattern']], | ||||
|             ) -> None: | ||||
|         if key in self.mapping: | ||||
|             raise LibraryError(f'"{key}" already exists in the library. Overwriting is not allowed!') | ||||
| 
 | ||||
|         if callable(value): | ||||
|             value = value() | ||||
|         else: | ||||
|             value = value | ||||
|         self.mapping[key] = value | ||||
| 
 | ||||
|     def __delitem__(self, key: str) -> None: | ||||
|         del self.mapping[key] | ||||
| 
 | ||||
|     def set_const(self, key: str, value: 'Pattern') -> None: | ||||
|         self[key] = value | ||||
| 
 | ||||
|     def _merge(self, other: Mapping[str, 'Pattern'], key: str) -> None: | ||||
|         self[key] = other[key] | ||||
| 
 | ||||
| @ -721,8 +726,20 @@ class LazyLibrary(MutableLibrary): | ||||
|         self.cache = {} | ||||
|         self._lookups_in_progress = set() | ||||
| 
 | ||||
|     def __setitem__(self, key: str, value: Callable[[], 'Pattern']) -> None: | ||||
|         self.dict[key] = value | ||||
|     def __setitem__( | ||||
|             self, | ||||
|             key: str, | ||||
|             value: Union['Pattern', Callable[[], 'Pattern']], | ||||
|             ) -> None: | ||||
|         if key in self.dict: | ||||
|             raise LibraryError(f'"{key}" already exists in the library. Overwriting is not allowed!') | ||||
| 
 | ||||
|         if callable(value): | ||||
|             value_func = value | ||||
|         else: | ||||
|             value_func = lambda: cast('Pattern', value)      # noqa: E731 | ||||
| 
 | ||||
|         self.dict[key] = value_func | ||||
|         if key in self.cache: | ||||
|             del self.cache[key] | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user