Skip to content

Commit 13e7bbf

Browse files
committed
Less leaky abstractin' while crawling.
1 parent b8a11eb commit 13e7bbf

File tree

1 file changed

+11
-22
lines changed

1 file changed

+11
-22
lines changed

referencing/_core.py

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from urllib.parse import unquote, urldefrag, urljoin
55

66
from attrs import evolve, field
7-
from pyrsistent import m, plist, s
7+
from pyrsistent import m, plist, pmap, s
88
from pyrsistent.typing import PList, PMap, PSet
99

1010
from referencing._attrs import define, frozen
@@ -178,16 +178,6 @@ def with_identified_resources(
178178
uncrawled=uncrawled.persistent(),
179179
)
180180

181-
def _with_anchors(
182-
self,
183-
uri: str,
184-
anchors: Iterable[AnchorType],
185-
) -> Registry:
186-
assert uri.endswith("#") or "#" not in uri, uri
187-
resource, old = self._contents[uri]
188-
new = old.update({anchor.name: anchor for anchor in anchors})
189-
return evolve(self, contents=self._contents.set(uri, (resource, new)))
190-
191181
def resource_at(
192182
self,
193183
uri: str,
@@ -199,26 +189,25 @@ def resource_at(
199189
return *at_uri, self
200190

201191
def _crawl(self) -> Registry:
202-
registry = self
203-
resources = [(uri, self._contents[uri][0]) for uri in self._uncrawled]
192+
contents = self._contents.evolver()
193+
resources = [(uri, contents[uri][0]) for uri in self._uncrawled]
204194
while resources:
205195
base_uri, resource = resources.pop()
196+
anchors = pmap((each.name, each) for each in resource.anchors())
197+
206198
id = resource.id()
207199
if id is None:
208200
uri = base_uri
201+
202+
if anchors:
203+
old, old_anchors = contents[uri]
204+
contents[uri] = old, old_anchors.update(anchors)
209205
else:
210206
uri = urljoin(base_uri, id)
211-
registry = registry.with_identified_resource(
212-
uri=uri,
213-
resource=resource,
214-
)
215-
216-
anchors = resource.anchors()
217-
if anchors:
218-
registry = registry._with_anchors(uri, anchors)
207+
contents[uri] = resource, anchors
219208

220209
resources.extend((uri, each) for each in resource.subresources())
221-
return evolve(registry, uncrawled=s())
210+
return evolve(self, contents=contents.persistent(), uncrawled=s())
222211

223212
def resolver(self, root: Schema, specification: Specification) -> Resolver:
224213
uri = specification.id_of(root) or ""

0 commit comments

Comments
 (0)