Skip to content

Instantly share code, notes, and snippets.

@iarenaza
Created March 23, 2020 09:28
Show Gist options
  • Save iarenaza/b55d14b8f19a35f57f397dc2f9f22542 to your computer and use it in GitHub Desktop.
Save iarenaza/b55d14b8f19a35f57f397dc2f9f22542 to your computer and use it in GitHub Desktop.
flat-seq-to-tree-structure.clj
user> (defn build-hierarchy [flat-list current-root]
(let [{:keys [direct-children others]} (reduce-kv (fn [m k v]
(if (= (:parent-id v) (:id current-root))
(update m :direct-children conj v)
(update m :others conj v)))
(sorted-map)
(vec flat-list))]
(if (seq direct-children)
(let [children (map (fn [direct-child]
(build-hierarchy others direct-child))
direct-children)]
(assoc current-root :children children))
current-root)))
#'user/build-hierarchy
user> (let [tip {:id #uuid "00000000-0000-0000-0000-000000000000"
:label "Top level workspace"
:parent-id nil}
workspaces-flat-list [{:id #uuid "00000000-0000-0000-0000-000000000001"
:label "Second level workspace 1"
:parent-id #uuid "00000000-0000-0000-0000-000000000000"}
{:id #uuid "00000000-0000-0000-0001-000000000001"
:label "Third level workspace 1-1"
:parent-id #uuid "00000000-0000-0000-0000-000000000001"}
{:id #uuid "00000000-0000-0000-0001-000000000002"
:label "Third level workspace 1-2"
:parent-id #uuid "00000000-0000-0000-0000-000000000001"}
{:id #uuid "00000000-0000-0000-0001-000000000003"
:label "Third level workspace 1-3"
:parent-id #uuid "00000000-0000-0000-0000-000000000001"}
{:id #uuid "00000000-0000-0001-0001-000000000001"
:label "Fourth level workspace 1-1-1"
:parent-id #uuid "00000000-0000-0000-0001-000000000001"}
{:id #uuid "00000000-0001-0001-0001-000000000001"
:label "Fifth level workspace 1-1-1-1"
:parent-id #uuid "00000000-0000-0001-0001-000000000001"}
{:id #uuid "00000000-0000-0000-0000-000000000002"
:label "Second level workspace 2"
:parent-id #uuid "00000000-0000-0000-0000-000000000000"}
{:id #uuid "00000000-0000-0000-0002-000000000001"
:label "Third level workspace 2-1"
:parent-id #uuid "00000000-0000-0000-0000-000000000002"}
{:id #uuid "00000000-0000-0000-0002-000000000002"
:label "Third level workspace 2-2"
:parent-id #uuid "00000000-0000-0000-0000-000000000002" }
{:id #uuid "00000000-0000-0000-0002-000000000003"
:label "Third level workspace 2-3"
:parent-id #uuid "00000000-0000-0000-0000-000000000002"}
{:id #uuid "00000000-0000-0000-0000-000000000003"
:label "Second level workspace 3"
:parent-id #uuid "00000000-0000-0000-0000-000000000000"}
{:id #uuid "00000000-0000-0000-0003-000000000001"
:label "Third level workspace 3-1"
:parent-id #uuid "00000000-0000-0000-0000-000000000003"}
{:id #uuid "00000000-0000-0000-0003-000000000002"
:label "Third level workspace 3-2"
:parent-id #uuid "00000000-0000-0000-0000-000000000003"}
{:id #uuid "00000000-0000-0000-0003-000000000003"
:label "Third level workspace 3-3"
:parent-id #uuid "00000000-0000-0000-0000-000000000003"}]]
(clojure.pprint/pprint (build-hierarchy workspaces-flat-list tip)))
{:id #uuid "00000000-0000-0000-0000-000000000000",
:label "Top level workspace",
:parent-id nil,
:children
({:id #uuid "00000000-0000-0000-0000-000000000003",
:label "Second level workspace 3",
:parent-id #uuid "00000000-0000-0000-0000-000000000000",
:children
({:id #uuid "00000000-0000-0000-0003-000000000001",
:label "Third level workspace 3-1",
:parent-id #uuid "00000000-0000-0000-0000-000000000003"}
{:id #uuid "00000000-0000-0000-0003-000000000002",
:label "Third level workspace 3-2",
:parent-id #uuid "00000000-0000-0000-0000-000000000003"}
{:id #uuid "00000000-0000-0000-0003-000000000003",
:label "Third level workspace 3-3",
:parent-id #uuid "00000000-0000-0000-0000-000000000003"})}
{:id #uuid "00000000-0000-0000-0000-000000000002",
:label "Second level workspace 2",
:parent-id #uuid "00000000-0000-0000-0000-000000000000",
:children
({:id #uuid "00000000-0000-0000-0002-000000000001",
:label "Third level workspace 2-1",
:parent-id #uuid "00000000-0000-0000-0000-000000000002"}
{:id #uuid "00000000-0000-0000-0002-000000000002",
:label "Third level workspace 2-2",
:parent-id #uuid "00000000-0000-0000-0000-000000000002"}
{:id #uuid "00000000-0000-0000-0002-000000000003",
:label "Third level workspace 2-3",
:parent-id #uuid "00000000-0000-0000-0000-000000000002"})}
{:id #uuid "00000000-0000-0000-0000-000000000001",
:label "Second level workspace 1",
:parent-id #uuid "00000000-0000-0000-0000-000000000000",
:children
({:id #uuid "00000000-0000-0000-0001-000000000001",
:label "Third level workspace 1-1",
:parent-id #uuid "00000000-0000-0000-0000-000000000001",
:children
({:id #uuid "00000000-0000-0001-0001-000000000001",
:label "Fourth level workspace 1-1-1",
:parent-id #uuid "00000000-0000-0000-0001-000000000001",
:children
({:id #uuid "00000000-0001-0001-0001-000000000001",
:label "Fifth level workspace 1-1-1-1",
:parent-id #uuid "00000000-0000-0001-0001-000000000001"})})}
{:id #uuid "00000000-0000-0000-0001-000000000002",
:label "Third level workspace 1-2",
:parent-id #uuid "00000000-0000-0000-0000-000000000001"}
{:id #uuid "00000000-0000-0000-0001-000000000003",
:label "Third level workspace 1-3",
:parent-id #uuid "00000000-0000-0000-0000-000000000001"})})}
nil
user>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment