-
Notifications
You must be signed in to change notification settings - Fork 10
/
crop.clj
45 lines (40 loc) · 1.95 KB
/
crop.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
(ns leiningen.polylith.cmd.doc.crop
(:require [leiningen.polylith.cmd.doc.shared-doc :as shared-doc]
[leiningen.polylith.cmd.deps :as cdeps]
[leiningen.polylith.cmd.shared :as shared]
[clojure.set :as set]))
(defn dependencies [ws-path top-dir type system-or-env]
(let [used-entities (shared/used-entities ws-path top-dir type system-or-env)
used-components (set/intersection used-entities (shared/all-components ws-path))
used-bases (set/intersection used-entities (shared/all-bases ws-path))]
(cdeps/component-dependencies ws-path top-dir used-components used-bases)))
(defn dependency-tree [entity deps all-bases]
{:entity entity
:type (shared-doc/entity-type entity all-bases)
:children (mapv #(dependency-tree % deps all-bases) (deps entity))})
(defn system-or-env-tree [ws-path top-dir all-bases type system-or-env entity]
(let [deps (dependencies ws-path top-dir type system-or-env)]
(dependency-tree entity deps all-bases)))
(defn entity-usages
([tree]
(into {} (map (juxt first #(-> % second first second))
(group-by first (sort (entity-usages 0 [0 [] tree]))))))
([x [y result {:keys [entity children]}]]
(conj (apply concat
(map-indexed #(entity-usages % [(inc y)
result
%2])
children))
(conj [entity [y x]]))))
(defn crop-branches [x [maxy y {:keys [entity type top children]} usages result]]
(if (= [y x] (usages entity))
(assoc result :entity entity
:type type
:top top
:children (if (< y maxy)
(vec (map-indexed #(crop-branches (+ x %) [maxy (inc y) %2 usages result]) children))
[]))
(assoc result :entity entity
:type type
:top top
:children [])))