From c7469051f454fce7106787c4e19a02cb6c4d656f Mon Sep 17 00:00:00 2001
From: Simon Brooke <simon@journeyman.cc>
Date: Sun, 31 May 2020 11:31:36 +0100
Subject: [PATCH] Kibitsing, cleanup.

There's a problem here that both kibit and cloverage are reporting an unterminated file, but all tests run.
---
 src/walkmap/core.clj     |  9 --------
 src/walkmap/edge.clj     | 13 -----------
 src/walkmap/geometry.clj | 17 --------------
 src/walkmap/read_svg.clj |  3 +--
 src/walkmap/stl.clj      | 36 ++++++++++++++++--------------
 src/walkmap/tag.clj      | 48 ++++++++++++++++++----------------------
 src/walkmap/utils.clj    | 14 ++++++++++++
 7 files changed, 57 insertions(+), 83 deletions(-)
 delete mode 100644 src/walkmap/core.clj
 delete mode 100644 src/walkmap/geometry.clj

diff --git a/src/walkmap/core.clj b/src/walkmap/core.clj
deleted file mode 100644
index 3499a93..0000000
--- a/src/walkmap/core.clj
+++ /dev/null
@@ -1,9 +0,0 @@
-(ns walkmap.core
-  "This namespace mostly gets used as a scratchpad for ideas which haven't yet
-  solidified."
-  (:require [clojure.java.io :as io :refer [file output-stream input-stream]]
-            [clojure.string :as s]
-            [hiccup.core :refer [html]]
-            [me.raynes.fs :as fs]
-            [taoensso.timbre :as l :refer [info error spy]]))
-
diff --git a/src/walkmap/edge.clj b/src/walkmap/edge.clj
index 6ddf3e2..52ad4c9 100644
--- a/src/walkmap/edge.clj
+++ b/src/walkmap/edge.clj
@@ -122,19 +122,6 @@
       (> (minimaxd e1 :y max) (minimaxd e2 :y min))
       (< (minimaxd e1 :y min) (minimaxd e2 :y max)))))
 
-;; Don't think I need this.
-;; (defn orientation
-;;   "Determine whether the ordered sequence of vertices `p`, `q` and `r` run
-;;   clockwise, collinear or anticlockwise in the x,y plane."
-;;   [p q r]
-;;   (let [v (- (* (- (:y q) (:y p)) (- (:x r) (:x q)))
-;;             (* (- (:x q) (:x p)) (- (:y r) (:y q))))]
-;;     (cond
-;;       (zero? v) :collinear
-;;       (pos? v) :clockwise
-;;       :else
-;;       :anticlockwise)))
-
 (defn intersection2d
   "The probability of two lines intersecting in 3d space is low, and actually
   that is mostly not something we're interested in. We're interested in
diff --git a/src/walkmap/geometry.clj b/src/walkmap/geometry.clj
deleted file mode 100644
index d1a4fbe..0000000
--- a/src/walkmap/geometry.clj
+++ /dev/null
@@ -1,17 +0,0 @@
-(ns walkmap.geometry
-  (:require [clojure.math.combinatorics :as combo]
-            [clojure.math.numeric-tower :as m]))
-
-(defn =ish
-  "True if numbers `n1`, `n2` are roughly equal; that is to say, equal to
-  within `tolerance` (defaults to one part in a million)."
-  ([n1 n2]
-   (if (and (number? n1) (number? n2))
-     (let [m (m/abs (min n1 n2))
-           t (if (zero? m) 0.000001 (* 0.000001 m))]
-       (=ish n1 n2 t))
-     (= n1 n2)))
-  ([n1 n2 tolerance]
-   (if (and (number? n1) (number? n2))
-     (< (m/abs (- n1 n2)) tolerance)
-     (= n1 n2))))
diff --git a/src/walkmap/read_svg.clj b/src/walkmap/read_svg.clj
index b86f205..ef3e420 100644
--- a/src/walkmap/read_svg.clj
+++ b/src/walkmap/read_svg.clj
@@ -9,7 +9,6 @@
             [clojure.zip :as z]
             [taoensso.timbre :as l]
             [walkmap.path :refer [path]]
-;;            [walkmap.polygon :refer [polygon]]
             [walkmap.tag :refer [tag]]
             [walkmap.utils :refer [kind-type truncate]]
             [walkmap.vertex :refer [vertex vertex?]]))
@@ -59,7 +58,7 @@
   representing the line (`l`, `L`) and move (`m`, `M`) commands in
   that path."
   [elt]
-  (if (= (-> elt :tag) :path)
+  (if (= (:tag elt) :path)
     (let [vs (command-string->vertices (-> elt :attrs :d))
           p  (when-not (empty? vs) (apply path vs))]
       (if (and p (-> elt :attrs :class))
diff --git a/src/walkmap/stl.clj b/src/walkmap/stl.clj
index 5e5da98..864b4ca 100644
--- a/src/walkmap/stl.clj
+++ b/src/walkmap/stl.clj
@@ -79,16 +79,21 @@
                    :facets (canonicalise (:facets o) map-kind))
      ;; if it has :vertices it's a polygon, but it may not yet conform to
      ;; `polygon?`
-     (:vertices o) (gradient
-                     (centre
-                       (tag
-                         (assoc o
-                           :walkmap.id/id (or
-                                            (:walkmap.id/id o)
-                                            (keyword (gensym "poly")))
-                           :kind :polygon
-                           :vertices (canonicalise (:vertices o) map-kind))
-                         :facet map-kind)))
+     (:vertices o) (let [f (gradient
+                             (centre
+                               (tag
+                                 (assoc o
+                                   :walkmap.id/id (or
+                                                    (:walkmap.id/id o)
+                                                    (keyword (gensym "poly")))
+                                   :kind :polygon
+                                   :vertices (canonicalise
+                                               (:vertices o)
+                                               map-kind))
+                                 :facet map-kind)))]
+                     (if (o/ocean? f)
+                       (tag f :ocean :no-traversal)
+                       f))
      ;; if it has a value for :x it's a vertex, but it may not yet conform
      ;; to `vertex?`; it should also be scaled using the scale-vertex, if any.
      (:x o) (let [c (v/canonicalise o)]
@@ -141,10 +146,10 @@
   (str
     (vect->str "facet normal" (:normal tri))
     "outer loop\n"
-    (apply str
-           (map
-             #(vect->str "vertex" %)
-             (:vertices tri)))
+    (s/join
+      (map
+        #(vect->str "vertex" %)
+        (:vertices tri)))
     "endloop\nendfacet\n"))
 
 (defn stl->ascii
@@ -157,8 +162,7 @@
      solidname
      (s/trim (:header stl))
      "\n"
-     (apply
-       str
+     (s/join
        (map
          facet2str
          (:facets stl)))
diff --git a/src/walkmap/tag.clj b/src/walkmap/tag.clj
index d0a9c42..0df4ade 100644
--- a/src/walkmap/tag.clj
+++ b/src/walkmap/tag.clj
@@ -13,18 +13,17 @@
   1. `object` is not a map;
   2. any of `tags` is not a keyword."
   [object & tags]
-  (if
-    (map? object)
-    (if
-      (every? keyword? tags)
+  (when-not (map? object)
+    (throw (IllegalArgumentException.
+             (str "Must be a map: " (kind-type object)))))
+  (let [tags' (flatten tags)]
+    (when-not (every? keyword? tags')
+      (throw (IllegalArgumentException.
+               (str "Must be keywords: " (map kind-type tags')))))
       (let [ot (::tags object)]
         (and
           (set? ot)
-          (every? ot tags)))
-      (throw (IllegalArgumentException.
-               (str "Must be keyword(s): " (map kind-type tags)))))
-    (throw (IllegalArgumentException.
-             (str "Must be a map: " (kind-type object))))))
+          (every? ot tags')))))
 
 (defn tag
   "Return an object like this `object` but with these `tags` added to its tags,
@@ -38,16 +37,14 @@
   useful things like `(tag obj (map keyword some-strings))`."
   [object & tags]
   (l/debug "Tagging" (kind-type object) "with" tags)
+  (when-not (map? object)
+    (throw (IllegalArgumentException.
+             (str "Must be a map: " (kind-type object)))))
   (let [tags' (flatten tags)]
-    (if
-      (map? object)
-      (if
-        (every? keyword? tags')
-        (assoc object ::tags (union (set tags') (::tags object)))
-        (throw (IllegalArgumentException.
-                 (str "Must be keyword(s): " (map kind-type tags')))))
+    (when-not (every? keyword? tags')
       (throw (IllegalArgumentException.
-               (str "Must be a map: " (kind-type object)))))))
+               (str "Must be keywords: " (map kind-type tags')))))
+        (assoc object ::tags (union (set tags') (::tags object)))))
 
 (defmacro tags
   "Return the tags of this object, if any."
@@ -59,14 +56,13 @@
   tags, if present. It is an error (and an exception will be thrown) if
 
   1. `object` is not a map;
-  2. any of `tags` is not a keyword."
+  2. any of `tags` is not a keyword or sequence of keywords."
   [object & tags]
-  (if
-    (map? object)
-    (if
-      (every? keyword? tags)
-      (assoc object ::tags (difference (::tags object) (set tags)))
-      (throw (IllegalArgumentException.
-               (str "Must be keywords: " (map kind-type tags)))))
+  (when-not (map? object)
     (throw (IllegalArgumentException.
-             (str "Must be a map: " (kind-type object))))))
+             (str "Must be a map: " (kind-type object)))))
+  (let [tags' (flatten tags)]
+    (when-not (every? keyword? tags')
+      (throw (IllegalArgumentException.
+               (str "Must be keywords: " (map kind-type tags')))))
+    (assoc object ::tags (difference (::tags object) (set tags')))))
diff --git a/src/walkmap/utils.clj b/src/walkmap/utils.clj
index 8fa7197..109d981 100644
--- a/src/walkmap/utils.clj
+++ b/src/walkmap/utils.clj
@@ -27,3 +27,17 @@
   ,essages, so return \"nil\"."
   [object]
   (or (:kind object) (type object) "nil"))
+
+(defn =ish
+  "True if numbers `n1`, `n2` are roughly equal; that is to say, equal to
+  within `tolerance` (defaults to one part in a million)."
+  ([n1 n2]
+   (if (and (number? n1) (number? n2))
+     (let [m (m/abs (min n1 n2))
+           t (if (zero? m) 0.000001 (* 0.000001 m))]
+       (=ish n1 n2 t))
+     (= n1 n2)))
+  ([n1 n2 tolerance]
+   (if (and (number? n1) (number? n2))
+     (< (m/abs (- n1 n2)) tolerance)
+     (= n1 n2))))