Skip to content

Instantly share code, notes, and snippets.

@fogus
Last active October 14, 2016 01:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fogus/8bad1f6ac285977d48aa10e38ebd06fc to your computer and use it in GitHub Desktop.
Save fogus/8bad1f6ac285977d48aa10e38ebd06fc to your computer and use it in GitHub Desktop.
#{[:africa/east :africa/south]
[:africa/east :africa/west]
[:africa/east :asia/west]
[:africa/east :europe/south]
[:africa/south :africa/east]
[:africa/south :africa/west]
[:africa/south :australia/west]
[:africa/south :south-america/east]
[:africa/south :south-america/south]
[:africa/west :africa/east]
[:africa/west :africa/south]
[:africa/west :europe/west]
[:africa/west :north-america/south]
[:africa/west :south-america/east]
[:asia/east :asia/north]
[:asia/east :asia/west]
[:asia/east :australia/east]
[:asia/east :australia/north]
[:asia/east :south-america/west]
[:asia/north :asia/east]
[:asia/north :asia/west]
[:asia/north :europe/east]
[:asia/north :north-america/east]
[:asia/north :north-america/west]
[:asia/west :africa/east]
[:asia/west :asia/east]
[:asia/west :asia/north]
[:asia/west :australia/north]
[:asia/west :europe/south]
[:australia/east :asia/east]
[:australia/east :australia/north]
[:australia/east :australia/west]
[:australia/east :north-america/south]
[:australia/east :south-america/south]
[:australia/north :asia/east]
[:australia/north :asia/west]
[:australia/north :australia/east]
[:australia/north :australia/west]
[:australia/north :europe/south]
[:australia/west :africa/south]
[:australia/west :australia/east]
[:australia/west :australia/north]
[:australia/west :south-america/south]
[:europe/east :asia/north]
[:europe/east :europe/south]
[:europe/east :europe/west]
[:europe/east :north-america/east]
[:europe/east :north-america/south]
[:europe/south :africa/east]
[:europe/south :asia/west]
[:europe/south :australia/north]
[:europe/south :europe/east]
[:europe/south :europe/west]
[:europe/west :africa/west]
[:europe/west :europe/east]
[:europe/west :europe/south]
[:europe/west :north-america/east]
[:europe/west :south-america/east]
[:north-america/east :asia/north]
[:north-america/east :europe/east]
[:north-america/east :europe/west]
[:north-america/east :north-america/south]
[:north-america/east :north-america/west]
[:north-america/south :africa/west]
[:north-america/south :australia/east]
[:north-america/south :europe/east]
[:north-america/south :north-america/east]
[:north-america/south :north-america/west]
[:north-america/south :south-america/west]
[:north-america/west :asia/north]
[:north-america/west :north-america/east]
[:north-america/west :north-america/south]
[:north-america/west :south-america/west]
[:south-america/east :africa/south]
[:south-america/east :africa/west]
[:south-america/east :europe/west]
[:south-america/east :south-america/south]
[:south-america/east :south-america/west]
[:south-america/south :africa/south]
[:south-america/south :australia/east]
[:south-america/south :australia/west]
[:south-america/south :south-america/east]
[:south-america/south :south-america/west]
[:south-america/west :asia/east]
[:south-america/west :north-america/south]
[:south-america/west :north-america/west]
[:south-america/west :south-america/east]
[:south-america/west :south-america/south]}
(ns ww5.core
(:require [datomic.api :as d]))
(def groups {:north-america #{:north-america/south :north-america/west :north-america/east}
:south-america #{:south-america/south :south-america/west :south-america/east}
:europe #{:europe/west :europe/east :europe/south}
:africa #{:africa/west :africa/east :africa/south}
:asia #{:asia/west :asia/east :asia/north}
:australia #{:australia/west :australia/east :australia/north}})
(def map-seed
[
[:north-america/south :south-america/west]
[:north-america/south :australia/east]
[:north-america/south :europe/east]
[:north-america/south :africa/west]
[:north-america/west :asia/north]
[:north-america/west :south-america/west]
[:north-america/east :asia/north]
[:north-america/east :europe/east]
[:north-america/east :europe/west]
[:south-america/south :australia/east]
[:south-america/south :africa/south]
[:south-america/south :australia/west]
[:south-america/west :asia/east]
[:south-america/east :europe/west]
[:south-america/east :africa/west]
[:south-america/east :africa/south]
[:europe/south :africa/east]
[:europe/south :asia/west]
[:europe/south :australia/north]
[:europe/east :asia/north]
[:europe/west :africa/west]
[:africa/south :australia/west]
[:africa/east :europe/south]
[:africa/east :asia/west]
[:asia/west :australia/north]
[:asia/east :australia/east]
[:asia/east :australia/north]
])
(defn ^:private infer-group-connections [from groups]
(let [group-name (keyword (namespace from))
adjacents (remove #(= % from) (get groups group-name))]
(map vec (partition 2 (interleave (repeat from) adjacents)))))
(defn expand-connections
"Takes a seed map (with all one-way links) and a
group definition and returns a fully expanded
map."
[seed groups]
(reduce (fn [acc pair]
(let [[start end] pair]
(-> acc
(conj [end start])
(conj [start end])
(into (infer-group-connections start groups))
(into (infer-group-connections end groups)))))
(sorted-set)
seed))
(def uri "datomic:mem://ww5")
(d/create-database uri)
(def conn (d/connect uri))
(def schema [{:db/id #db/id[:db.part/db -1]
:db/ident :map/group
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one
:db/doc ""
:db.install/_attribute :db.part/db}
{:db/id #db/id[:db.part/db -2]
:db/ident :map/region
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one
:db/doc ""
:db.install/_attribute :db.part/db}
{:db/id #db/id[:db.part/db -3]
:db/ident :region/connections
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many
:db/doc ""
:db.install/_attribute :db.part/db}
{:db/id #db/id[:db.part/db -4]
:db/ident :group/components
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many
:db/doc ""
:db.install/_attribute :db.part/db}])
(defn ^:private datomify-groups [graph]
(for [key (keys graph)]
(let [tid (d/tempid :db.part/user)]
[tid :map/group key])))
(comment
(-> map-seed
(expand-connections groups)
)
clojure.java.io/writer
(datomify-groups groups)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment