sclass WebScraper { S baseURL; new Set urlsSeen; new LinkedHashSet linksToFollow; *(S *baseURL, S startURL) { addLink(startURL); } void addLinks(Iterable urls) { for (S url : urls) addLink(url); } void addLink(S url) { if (!urlsSeen.contains(url) && startsWith(url, baseURL)) linksToFollow.add(url); } bool step { if (empty(linksToFollow)) false; _loadURL(popFirst(linksToFollow)); true; } void _loadURL(S url) { urlsSeen.add(url); addLinks(pairsA(webScraper_getLinks(url))); } run { while (step()) print("URLs checked: " + l(urlsSeen)); print("Scraping done."); } }