diff --git a/src/loom/derived.cljc b/src/loom/derived.cljc index c5bc7ed..71f1008 100644 --- a/src/loom/derived.cljc +++ b/src/loom/derived.cljc @@ -12,9 +12,12 @@ edge [uu, vv] is an edge in the resulting graph iff g has an edge [u, v] such that [uu, vv] = [(f u), (f v)]." [f g] - (-> (if (directed? g) (digraph) (graph)) - (add-nodes* (map f (nodes g))) - (add-edges* (map #(map f %) (edges g))))) + (let [mapped-nodes (into {} (map (fn [n] + [n (f n)]) + (nodes g)))] + (-> (if (directed? g) (digraph) (graph)) + (add-nodes* (map mapped-nodes (nodes g))) + (add-edges* (map #(map mapped-nodes %) (edges g)))))) (defn subgraph-reachable-from "Returns a subgraph of the given graph which contains all nodes and edges that diff --git a/test/loom/test/derived.cljc b/test/loom/test/derived.cljc index c6dce6e..9fcb1a1 100644 --- a/test/loom/test/derived.cljc +++ b/test/loom/test/derived.cljc @@ -1,7 +1,7 @@ (ns loom.test.derived (:require [loom.derived :refer [mapped-by nodes-filtered-by edges-filtered-by subgraph-reachable-from bipartite-subgraph]] - [loom.graph :refer (graph digraph edges)] + [loom.graph :refer (graph digraph edges nodes)] [loom.alg :refer (eql?)] #?@(:clj [[clojure.test :refer :all]] :cljs [cljs.test])) @@ -19,6 +19,10 @@ (mapped-by inc g)) true (eql? (graph [2 0] [2 1] [0 1] 2) (mapped-by #(mod % 3) g)) + + (count (nodes g)) (let [counter (atom 0)] + (count (nodes (mapped-by (fn [_] (swap! counter inc)) + g)))) ;; digraph true (eql? dg (mapped-by identity dg))