Skip to content

Instantly share code, notes, and snippets.

@moserrya
Created June 23, 2014 04:40
Show Gist options
  • Save moserrya/3c9ba19f9e9279036b6f to your computer and use it in GitHub Desktop.
Save moserrya/3c9ba19f9e9279036b6f to your computer and use it in GitHub Desktop.

Revisions

  1. moserrya created this gist Jun 23, 2014.
    34 changes: 34 additions & 0 deletions baconator.clj
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,34 @@
    (ns erdos-c.core
    [:require [yokogiri.core :refer :all]])

    (def client (make-client :javascript false))

    (defn page [uri]
    (get-page client (str "http://en.wikipedia.org" uri)))

    (defn link-snippets [uri]
    (xpath (page uri) "//a"))

    (defn links [uri]
    (->> uri
    (link-snippets)
    (map attrs)
    (map :href)
    (remove nil?)))

    (defn wikifilter [uri]
    (re-find #"\A\/wiki\/" uri))

    (defn wiki-links [uri]
    (filter wikifilter (links uri)))

    (defn search [start target]
    (loop [queue (conj (clojure.lang.PersistentQueue/EMPTY) (list start))
    visited #{}]
    (let [links (peek queue)
    test-link (first links)
    page-links (filter #(not (contains? visited %)) (wiki-links test-link))]
    (if (some #(= target %) page-links)
    links
    (recur (pop (apply conj queue (map #(cons % links) page-links)))
    (apply conj visited page-links))))))