540 lines
35 KiB
HTML
540 lines
35 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<link rel="stylesheet" href="../coverage.css"/> <title> walkmap/edge.clj </title>
|
|
</head>
|
|
<body>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
001 (ns walkmap.edge
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
002 "Essentially the specification for things we shall consider to be an edge.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
003 An edge is a line segment having just a start and an end, with no intervening
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
004 nodes."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
005 (:require [clojure.math.numeric-tower :as m]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
006 [walkmap.utils :as u]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
007 [walkmap.vertex :refer [canonicalise ensure2d ensure3d vertex vertex= vertex?]]))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
008
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
009 (defn edge
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
010 "Return an edge between vertices `v1` and `v2`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
011 [v1 v2]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
012 (if
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
013 (and (vertex? v1) (vertex? v2))
|
|
</span><br/>
|
|
<span class="covered" title="13 out of 13 forms covered">
|
|
014 {:kind :edge :walkmap.id/id (keyword (gensym "edge")) :start v1 :end v2}
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
015 (throw (IllegalArgumentException. "Must be vertices."))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
016
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
017 (defn edge?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
018 "True if `o` satisfies the conditions for a edge. An edge shall be a map
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
019 having the keys `:start` and `:end`, such that the values of each of those
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
020 keys shall be a vertex."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
021 [o]
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
022 (and
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
023 (map? o)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
024 (vertex? (:start o))
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
025 (vertex? (:end o))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
026
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
027 (defn length
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
028 "Return the length of the edge `e`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
029 [e]
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
030 (let [start (ensure3d (:start e))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
031 end (ensure3d (:end e))]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
032 (m/sqrt
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
033 (reduce
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
034 +
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
035 (map
|
|
</span><br/>
|
|
<span class="covered" title="11 out of 11 forms covered">
|
|
036 #(m/expt (- (% end) (% start)) 2)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
037 [:x :y :z])))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
038
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
039 (defn centre
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
040 "Return the vertex that represents the centre of this `edge`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
041 [edge]
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
042 (let [s (ensure3d (:start edge))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
043 e (ensure3d (:end edge))]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
044 (vertex
|
|
</span><br/>
|
|
<span class="covered" title="16 out of 16 forms covered">
|
|
045 (+ (:x s) (/ (- (:x e) (:x s)) 2))
|
|
</span><br/>
|
|
<span class="covered" title="16 out of 16 forms covered">
|
|
046 (+ (:y s) (/ (- (:y e) (:y s)) 2))
|
|
</span><br/>
|
|
<span class="covered" title="16 out of 16 forms covered">
|
|
047 (+ (:z s) (/ (- (:z e) (:z s)) 2)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
048
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
049 (defn unit-vector
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
050 "Return an vertex parallel to `e` starting from the coordinate origin. Two
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
051 edges which are parallel will have the same unit vector."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
052 [e]
|
|
</span><br/>
|
|
<span class="covered" title="14 out of 14 forms covered">
|
|
053 (let [e' {:start (ensure3d (:start e)) :end (ensure3d (:end e))}
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
054 l (length e')]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
055 (canonicalise
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
056 (reduce
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
057 merge
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
058 {}
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
059 (map
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
060 (fn [k]
|
|
</span><br/>
|
|
<span class="covered" title="17 out of 17 forms covered">
|
|
061 {k (/ (- (k (:end e')) (k (:start e'))) l)})
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
062 [:x :y :z])))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
063
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
064 (defn parallel?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
065 "True if all `edges` passed are parallel with one another."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
066 [& edges]
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
067 (let [uvs (map unit-vector edges)]
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
068 (every?
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
069 #(vertex= % (first uvs))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
070 (rest uvs))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
071
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
072 (defn collinear?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
073 "True if edges `e1` and `e2` are collinear with one another."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
074 [e1 e2]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
075 (parallel?
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
076 e1
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
077 e2
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
078 (if (vertex= (:start e1) (:start e2))
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
079 {:start (:start e1) :end (:end e2)}
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
080 {:start (:start e1) :end (:start e2)})))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
081
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
082 (defn collinear2d?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
083 "True if the projections of edges `e1`, `e2` onto the x, y plane are
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
084 collinear."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
085 [e1 e2]
|
|
</span><br/>
|
|
<span class="covered" title="15 out of 15 forms covered">
|
|
086 (collinear? {:start (ensure2d (:start e1)) :end (ensure2d (:end e1))}
|
|
</span><br/>
|
|
<span class="covered" title="13 out of 13 forms covered">
|
|
087 {:start (ensure2d (:start e2)) :end (ensure2d (:end e2))}))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
088
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
089 (defn minimaxd
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
090 "Apply function `f` to `coord` of the vertices at start and end of `edge`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
091 and return the result. Intended use case is `f` = `min` or `max`, `coord`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
092 is `:x`, `:y` or `:z`. No checks are made for sane arguments."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
093 [edge coord f]
|
|
</span><br/>
|
|
<span class="covered" title="15 out of 15 forms covered">
|
|
094 (apply f (list (coord (:start edge)) (coord (:end edge)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
095
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
096 (defn on?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
097 "True if the vertex `v` is on the edge `e`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
098 [e v]
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
099 (let [p (ensure3d (:start e))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
100 q (ensure3d v)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
101 r (ensure3d (:end e))]
|
|
</span><br/>
|
|
<span class="partial" title="20 out of 25 forms covered">
|
|
102 (and
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
103 (collinear? (edge p q) (edge q r))
|
|
</span><br/>
|
|
<span class="covered" title="13 out of 13 forms covered">
|
|
104 (<= (:x q) (max (:x p) (:x r)))
|
|
</span><br/>
|
|
<span class="covered" title="13 out of 13 forms covered">
|
|
105 (>= (:x q) (min (:x p) (:x r)))
|
|
</span><br/>
|
|
<span class="covered" title="13 out of 13 forms covered">
|
|
106 (<= (:y q) (max (:y p) (:y r)))
|
|
</span><br/>
|
|
<span class="covered" title="13 out of 13 forms covered">
|
|
107 (>= (:y q) (min (:y p) (:y r)))
|
|
</span><br/>
|
|
<span class="covered" title="13 out of 13 forms covered">
|
|
108 (<= (:z q) (max (:z p) (:z r)))
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
109 (>= (:z q) (min (:z p) (:z r))))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
110
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
111 (defn on2d?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
112 "True if vertex `v` is on edge `e` when projected onto the x, y plane."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
113 [e v]
|
|
</span><br/>
|
|
<span class="covered" title="15 out of 15 forms covered">
|
|
114 (on? (edge (ensure2d (:start e)) (ensure2d (:end e))) v))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
115
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
116 (defn overlaps2d?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
117 "True if the recangle in the x,y plane bisected by edge `e1` overlaps that
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
118 bisected by edge `e2`. It is an error if either `e1` or `e2` is not an edge."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
119 [e1 e2]
|
|
</span><br/>
|
|
<span class="partial" title="11 out of 12 forms covered">
|
|
120 (when (and (edge? e1) (edge? e2))
|
|
</span><br/>
|
|
<span class="partial" title="11 out of 13 forms covered">
|
|
121 (and
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
122 (> (minimaxd e1 :x max) (minimaxd e2 :x min))
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
123 (< (minimaxd e1 :x min) (minimaxd e2 :x max))
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
124 (> (minimaxd e1 :y max) (minimaxd e2 :y min))
|
|
</span><br/>
|
|
<span class="covered" title="11 out of 11 forms covered">
|
|
125 (< (minimaxd e1 :y min) (minimaxd e2 :y max)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
126
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
127 (defn intersection2d
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
128 "The probability of two lines intersecting in 3d space is low, and actually
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
129 that is mostly not something we're interested in. We're interested in
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
130 intersection in the `x,y` plane. This function returns a vertex representing
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
131 a point vertically over the intersection of edges `e1`, `e2` in the `x,y`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
132 plane, whose `z` coordinate is
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
133
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
134 * 0 if both edges are 2d (i.e. have missing or zero `z` coordinates);
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
135 * if one edge is 2d, then the point on the other edge over the intersection;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
136 * otherwise, the average of the z coordinates of the points on the two
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
137 edges over the intersection.
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
138
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
139 If no such intersection exists, `nil` is returned.
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
140
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
141 It is an error, and an exception will be thrown, if either `e1` or `e2` is
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
142 not an edge."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
143 [e1 e2]
|
|
</span><br/>
|
|
<span class="covered" title="11 out of 11 forms covered">
|
|
144 (if (and (edge? e1) (edge? e2))
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
145 (when
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
146 (overlaps2d? e1 e2) ;; relatively cheap check
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
147 (if
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
148 (collinear2d? e1 e2)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
149 ;; any point within the overlap will do, but we'll pick the end of e1
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
150 ;; which is on e2
|
|
</span><br/>
|
|
<span class="partial" title="10 out of 13 forms covered">
|
|
151 (if (on2d? e2 (:start e1)) (:start e1) (:end e1))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
152 ;; blatantly stolen from
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
153 ;; https://gist.github.com/cassiel/3e725b49670356a9b936
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
154 (let [x1 (:x (:start e1))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
155 x2 (:x (:end e1))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
156 x3 (:x (:start e2))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
157 x4 (:x (:end e2))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
158 y1 (:y (:start e1))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
159 y2 (:y (:end e1))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
160 y3 (:y (:start e2))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
161 y4 (:y (:end e2))
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
162 denom (- (* (- x1 x2) (- y3 y4))
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
163 (* (- y1 y2) (- x3 x4)))
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
164 x1y2-y1x2 (- (* x1 y2) (* y1 x2))
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
165 x3y4-y3x4 (- (* x3 y4) (* y3 x4))
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
166 px-num (- (* x1y2-y1x2 (- x3 x4))
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
167 (* (- x1 x2) x3y4-y3x4))
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
168 py-num (- (* x1y2-y1x2 (- y3 y4))
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
169 (* (- y1 y2) x3y4-y3x4))
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
170 result (when-not (zero? denom)
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
171 (vertex (/ px-num denom) (/ py-num denom)))]
|
|
</span><br/>
|
|
<span class="partial" title="19 out of 20 forms covered">
|
|
172 (when (and result (on2d? e1 result) (on2d? e2 result)) result))))
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
173 (throw (IllegalArgumentException.
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
174 (str
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
175 "Both `e1` and `e2` must be edges."
|
|
</span><br/>
|
|
<span class="covered" title="16 out of 16 forms covered">
|
|
176 (map #(or (:kind %) (type %)) [e1 e2]))))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
177
|
|
</span><br/>
|
|
</body>
|
|
</html>
|