diff --git a/rainbowadn/collection/trees/binary/activebinarytree.py b/rainbowadn/collection/trees/binary/activebinarytree.py index 9c1bffc..b549d85 100644 --- a/rainbowadn/collection/trees/binary/activebinarytree.py +++ b/rainbowadn/collection/trees/binary/activebinarytree.py @@ -128,7 +128,7 @@ class ActiveCreation( else: resolved: BinaryTree[KeyMetadata[ActiveKeyType, MetaDataType]] = await tree.reference.resolve() assert isinstance(resolved, BinaryTree) - key_metadata: KeyMetadata[ActiveKeyType, MetaDataType] = await resolved.key.resolve() + key_metadata: KeyMetadata[ActiveKeyType, MetaDataType] = resolved.key assert isinstance(key_metadata, KeyMetadata) return BinarySplit( tree.create(resolved.treel), key_metadata.key, key_metadata.metadata, tree.create(resolved.treer) @@ -149,7 +149,7 @@ class ActiveCreation( BinaryTree( treel.reference, treer.reference, - HashPoint.of(KeyMetadata(key, await self.protocol.metadata(treel, treer, key, self))) + KeyMetadata(key, await self.protocol.metadata(treel, treer, key, self)) ) ) ) diff --git a/rainbowadn/collection/trees/binary/binarytree.py b/rainbowadn/collection/trees/binary/binarytree.py index b172d99..9626b25 100644 --- a/rainbowadn/collection/trees/binary/binarytree.py +++ b/rainbowadn/collection/trees/binary/binarytree.py @@ -10,7 +10,7 @@ TreeKeyType = TypeVar('TreeKeyType') class BinaryTree(RecursiveMentionable, Generic[TreeKeyType]): def __factory__(self) -> RainbowFactory['BinaryTree[TreeKeyType]']: - return self.factory(self.key.factory) + return self.factory(self.key.__factory__()) @classmethod def factory(cls, factory: RainbowFactory[TreeKeyType]) -> RainbowFactory['BinaryTree[TreeKeyType]']: @@ -21,17 +21,17 @@ class BinaryTree(RecursiveMentionable, Generic[TreeKeyType]): self, treel: NullableReference['BinaryTree[TreeKeyType]'], treer: NullableReference['BinaryTree[TreeKeyType]'], - key: HashPoint[TreeKeyType] + key: TreeKeyType ): assert isinstance(treel, NullableReference) assert isinstance(treer, NullableReference) - assert isinstance(key, HashPoint) + assert isinstance(key, Mentionable) self.treel = treel self.treer = treer self.key = key def points(self) -> Iterable[HashPoint]: - return [*self.treel.points(), *self.treer.points(), self.key] + return [*self.treel.points(), *self.treer.points(), *RecursiveMentionable.points_of(self.key)] def __bytes__(self): return bytes(self.treel) + bytes(self.treer) + bytes(self.key) @@ -40,7 +40,7 @@ class BinaryTree(RecursiveMentionable, Generic[TreeKeyType]): assert isinstance(tab, int) treel_str, key_str, treer_str = await gather( self.treel.str(tab), - hash_point_format(self.key, tab), + hash_point_format(HashPoint.of(self.key), tab), self.treer.str(tab), ) assert isinstance(treel_str, str) @@ -65,7 +65,7 @@ class BinaryTreeFactory(RainbowFactory[BinaryTree[TreeKeyType]], Generic[TreeKey source[HashPoint.HASH_LENGTH:HashPoint.HASH_LENGTH * 2], resolver ), - ResolverOrigin(self.factory, source[HashPoint.HASH_LENGTH * 2:], resolver).hash_point() + self.factory.from_bytes(source[HashPoint.HASH_LENGTH * 2:], resolver), ) def loose(self) -> RainbowFactory[BinaryTree[TreeKeyType]]: diff --git a/rainbowadn/core/recursivementionable.py b/rainbowadn/core/recursivementionable.py index 5be7113..1979c2e 100644 --- a/rainbowadn/core/recursivementionable.py +++ b/rainbowadn/core/recursivementionable.py @@ -11,6 +11,13 @@ class RecursiveMentionable(Mentionable, abc.ABC): def points(self) -> Iterable[HashPoint]: raise NotImplementedError + @classmethod + def points_of(cls, mentionable: Mentionable) -> Iterable[HashPoint]: + if isinstance(mentionable, RecursiveMentionable): + return mentionable.points() + else: + return [] + async def str(self, tab: int) -> str: assert isinstance(tab, int) return f'(recursive {self.__class__.__name__})'