Skip to content

Instantly share code, notes, and snippets.

@Orbots
Created October 8, 2013 17:23
Show Gist options
  • Save Orbots/6888226 to your computer and use it in GitHub Desktop.
Save Orbots/6888226 to your computer and use it in GitHub Desktop.
component entity system in clojurescript
;; TODO: deletion. warning when adding group to existing name. is this implemenation of groups a good thing?
(ns forces.framework.component
)
(def !nextEntityGUID (atom 1))
(def !names (atom {}))
(def !nameReverseLookup (atom {})) ;; name to guid map
(defn createEntity
([]
(let [eguid (deref !nextEntityGUID)]
(swap! !nextEntityGUID inc)
eguid))
([nameo]
(let [eguid (deref !nextEntityGUID)]
(swap! !nextEntityGUID inc)
(swap! !names assoc eguid nameo)
(swap! !nameReverseLookup assoc nameo eguid)
eguid))
([nameo unique]
(if (or (= unique false) (= nil (get @!nameReverseLookup nameo)))
(createEntity nameo)
nil)))
(defn createEntityInGroup [nameo]
(let [existing (get @!nameReverseLookup nameo)
createE (fn [n]
(let [eguid (deref !nextEntityGUID)]
(swap! !nextEntityGUID inc)
(swap! !names assoc eguid n)
eguid))]
(cond
(= nil existing)
(createEntity nameo)
(vector? existing )
(swap! !nameReverseLookup assoc nameo (conj existing (createE nameo) ))
:else
(swap! !nameReverseLookup assoc nameo (conj [existing] (createE nameo))))))
(defn getName [eguid] (get @!names eguid) )
(defn getEntityByName [nameo] (get @!nameReverseLookup nameo))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment