From 4ded279a4b4246b5562560f43a638b15f2e9a93e Mon Sep 17 00:00:00 2001 From: Matthew Chadwick Date: Sat, 31 Oct 2015 10:04:57 +0000 Subject: [PATCH] First go at translating to cljs --- .gitignore | 0 .travis.yml | 0 CHANGELOG.md | 0 README.md | 0 doc/loom_logo.png | Bin doc/loom_logo.svg | 0 doc/ns-dep-graph.png | Bin project.clj | 0 src/loom/alg.cljc | 7 +++--- src/loom/alg_generic.cljc | 0 src/loom/attr.cljc | 0 src/loom/dataflow.clj | 0 src/loom/flow.cljc | 0 src/loom/gen.cljc | 0 src/loom/graph.cljc | 43 +++++++++++++++++++-------------- src/loom/io.cljc | 0 src/loom/label.cljc | 0 test/loom/test/alg.clj | 0 test/loom/test/alg_generic.clj | 0 test/loom/test/attr.clj | 0 test/loom/test/flow.clj | 0 test/loom/test/graph.clj | 0 test/loom/test/label.clj | 0 23 files changed, 29 insertions(+), 21 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .travis.yml mode change 100644 => 100755 CHANGELOG.md mode change 100644 => 100755 README.md mode change 100644 => 100755 doc/loom_logo.png mode change 100644 => 100755 doc/loom_logo.svg mode change 100644 => 100755 doc/ns-dep-graph.png mode change 100644 => 100755 project.clj mode change 100644 => 100755 src/loom/alg.cljc mode change 100644 => 100755 src/loom/alg_generic.cljc mode change 100644 => 100755 src/loom/attr.cljc mode change 100644 => 100755 src/loom/dataflow.clj mode change 100644 => 100755 src/loom/flow.cljc mode change 100644 => 100755 src/loom/gen.cljc mode change 100644 => 100755 src/loom/graph.cljc mode change 100644 => 100755 src/loom/io.cljc mode change 100644 => 100755 src/loom/label.cljc mode change 100644 => 100755 test/loom/test/alg.clj mode change 100644 => 100755 test/loom/test/alg_generic.clj mode change 100644 => 100755 test/loom/test/attr.clj mode change 100644 => 100755 test/loom/test/flow.clj mode change 100644 => 100755 test/loom/test/graph.clj mode change 100644 => 100755 test/loom/test/label.clj diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.travis.yml b/.travis.yml old mode 100644 new mode 100755 diff --git a/CHANGELOG.md b/CHANGELOG.md old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/doc/loom_logo.png b/doc/loom_logo.png old mode 100644 new mode 100755 diff --git a/doc/loom_logo.svg b/doc/loom_logo.svg old mode 100644 new mode 100755 diff --git a/doc/ns-dep-graph.png b/doc/ns-dep-graph.png old mode 100644 new mode 100755 diff --git a/project.clj b/project.clj old mode 100644 new mode 100755 diff --git a/src/loom/alg.cljc b/src/loom/alg.cljc old mode 100644 new mode 100755 index b3964d7..0b89d2a --- a/src/loom/alg.cljc +++ b/src/loom/alg.cljc @@ -429,8 +429,8 @@ can use these functions." [g] (letfn [(color-component [coloring start] (loop [coloring (assoc coloring start 1) - queue (conj #?(:clj clojure.lang.PersistentQueue/EMPTY - :cljs cljs.core.PersistentQueue/EMPTY) start)] + queue (conj #?(:clj clojure.lang.PersistentQueue/EMPTY + :cljs (.-EMPTY cljs.core/PersistentQueue)) start)] (if (empty? queue) coloring (let [v (peek queue) @@ -606,7 +606,8 @@ can use these functions." ([g src target heur q explored] (cond ;; queue empty, target not reachable - (empty? q) (throw (Exception. "Target not reachable from source")) + (empty? q) (throw #?(:clj (Exception. "Target not reachable from source") + :cljs (js/Error. "Target not reachable from source"))) ;; target found, build path and return (= (first (peek q)) target) (let [u (first (peek q)) parent ((second (peek q)) 1) diff --git a/src/loom/alg_generic.cljc b/src/loom/alg_generic.cljc old mode 100644 new mode 100755 diff --git a/src/loom/attr.cljc b/src/loom/attr.cljc old mode 100644 new mode 100755 diff --git a/src/loom/dataflow.clj b/src/loom/dataflow.clj old mode 100644 new mode 100755 diff --git a/src/loom/flow.cljc b/src/loom/flow.cljc old mode 100644 new mode 100755 diff --git a/src/loom/gen.cljc b/src/loom/gen.cljc old mode 100644 new mode 100755 diff --git a/src/loom/graph.cljc b/src/loom/graph.cljc old mode 100644 new mode 100755 index 249e40d..f9cc1c1 --- a/src/loom/graph.cljc +++ b/src/loom/graph.cljc @@ -7,6 +7,9 @@ on adjacency lists." loom.graph (:require [loom.alg-generic :refer [bf-traverse]])) +;;; +;;; Protocols +;;; (defprotocol Graph (nodes [g] "Returns a collection of the nodes in graph g") @@ -82,7 +85,7 @@ on adjacency lists." (def ^{:dynamic true :doc "Weight used when none is given for edges in weighted graphs"} -*default-weight* 1) + *default-weight* 1) (def default-graph-impls {:all @@ -153,22 +156,6 @@ on adjacency lists." (apply dissoc m nodes) adjacents)) -(comment (defmacro extended-record [rn fv & spec] - (concat `(defrecord ~rn ~fv) - (mapcat - (fn [[pn pm]] - ;(println pm) - (cons pn - (mapcat - (fn [[fk fv]] - ;(println " " pn " " `~(cons (symbol (name fk)) (rest fv))) - (if (vector? (second fv)) - (list `~(cons (symbol (name fk)) (rest fv))) - (map (fn [fa] `~(cons (symbol (name fk)) fa)) (rest fv))) - ) - (if (map? pm) pm (eval pm))))) - (partition 2 spec))))) - ;;; ;;; Records for basic graphs -- one edge per vertex pair/direction, ;;; loops allowed @@ -177,6 +164,27 @@ on adjacency lists." ;; TODO: preserve metadata? ;; TODO: leverage zippers for faster record updates? + +; hi, as Clojurescript doesn't have extend, +; I used this macro to convert the +; following code to Clojurescript-compatable code. +; It's not pretty but it seems to work. Oh and the macro +; only runs in Clojure + +(comment (defmacro extended-record [rn fv & spec] + (concat `(defrecord ~rn ~fv) + (mapcat + (fn [[pn pm]] + (cons pn + (mapcat + (fn [[fk fv]] + (if (vector? (second fv)) + (list `~(cons (symbol (name fk)) (rest fv))) + (map (fn [fa] `~(cons (symbol (name fk)) fa)) (rest fv))) + ) + (if (map? pm) pm (eval pm))))) + (partition 2 spec))))) + (comment (defrecord BasicEditableGraph [nodeset adj]) (defrecord BasicEditableDigraph [nodeset adj in]) @@ -185,7 +193,6 @@ on adjacency lists." (defrecord BasicEditableGraph [nodeset adj] Graph (nodes [g] (:nodeset g)) (edges [g] (for [n1 (nodes g) e (out-edges g n1)] e)) (has-node? [g node] (contains? (:nodeset g) node)) (has-edge? [g n1 n2] (contains? (get-in g [:adj n1]) n2)) (out-degree [g node] (count (get-in g [:adj node]))) (out-edges [g] (partial out-edges g)) (out-edges [g node] (for [n2 (successors g node)] [node n2])) (successors [g] (partial successors g)) (successors [g node] (get-in g [:adj node])) EditableGraph (add-nodes* [g nodes] (reduce (fn [g node] (update-in g [:nodeset] conj node)) g nodes)) (add-edges* [g edges] (reduce (fn [g [n1 n2]] (-> g (update-in [:nodeset] conj n1 n2) (update-in [:adj n1] (fnil conj #{}) n2) (update-in [:adj n2] (fnil conj #{}) n1))) g edges)) (remove-nodes* [g nodes] (let [nbrs (mapcat (fn* [p1__66951#] (successors g p1__66951#)) nodes)] (-> g (update-in [:nodeset] (fn* [p1__66952#] (apply disj p1__66952# nodes))) (assoc :adj (remove-adj-nodes (:adj g) nodes nbrs disj))))) (remove-edges* [g edges] (reduce (fn [g [n1 n2]] (-> g (update-in [:adj n1] disj n2) (update-in [:adj n2] disj n1))) g edges)) (remove-all [g] (assoc g :nodeset #{} :adj {}))) - (comment (macroexpand-1 '(extended-record BasicEditableGraph [nodeset adj] Graph diff --git a/src/loom/io.cljc b/src/loom/io.cljc old mode 100644 new mode 100755 diff --git a/src/loom/label.cljc b/src/loom/label.cljc old mode 100644 new mode 100755 diff --git a/test/loom/test/alg.clj b/test/loom/test/alg.clj old mode 100644 new mode 100755 diff --git a/test/loom/test/alg_generic.clj b/test/loom/test/alg_generic.clj old mode 100644 new mode 100755 diff --git a/test/loom/test/attr.clj b/test/loom/test/attr.clj old mode 100644 new mode 100755 diff --git a/test/loom/test/flow.clj b/test/loom/test/flow.clj old mode 100644 new mode 100755 diff --git a/test/loom/test/graph.clj b/test/loom/test/graph.clj old mode 100644 new mode 100755 diff --git a/test/loom/test/label.clj b/test/loom/test/label.clj old mode 100644 new mode 100755