[docs]@dataclass(frozen=True)classGuppyLibrary:"""A collection of Guppy definitions that can be compiled together into a linkable unit exposing a public interface. Libraries can be created using static factory methods on this class. .. code-block:: python from guppylang.library import GuppyLibrary @guppy def foo() -> int: return 42 @guppy def bar() -> int: return 7 # Compilable collection containing `foo` and `bar`. lib = GuppyLibrary.from_members(foo, bar) """members:list[DefId]def_type_members(self)->list[DefId]:"""Any implementations registered for members of this library. Note that the list is only guaranteed to be complete after calling `check()` on the library members, since auto-generated implementations may be added during checking."""members:list[DefId]=[]fordef_idinself.members:# TODO automatic member inclusion should be based on the automatic# collection when availablemembers.extend(DEF_STORE.type_members[def_id].values())returnmembers
[docs]defcompile(self)->Package:"""Compile this collection of definitions into a HUGR package."""ENGINE.check(self.members)# Check fills _type_members with additional members only available after# checking, so we have to call it before compiling (without an engine reset).pointer=ENGINE.compile(self.members+self._type_members(),reset=False)formodinpointer.package.modules:_update_generator_metadata(mod)returnpointer.package
[docs]defcheck(self)->None:"""Type-check all contained definitions."""ENGINE.check(self.members)ENGINE.check(self._type_members(),reset=False)
[docs]deflink_name(name:str)->Any:"""Decorator to attach a link name to a Guppy definition. It must be placed below the @guppy decorator. .. code-block:: python from guppylang import guppy from guppylang.library import link_name @guppy.declare @link_name("my_link_name") def main() -> None: pass main.compile() """fromguppylang.decoratorimportmetadatareturnmetadata(_LINK_NAME_METADATA_KEY,name)