Actually, what I'm looking for is a way to use arbitrary types of keys
rather than integers.
I have this so far:
;;;; Table data structure.
;;;; For now, the table data structure is a map of maps.
(defn row
"Get a row of the table.
If only the key is passed, a row
lookup function is returned."
([r]
#(row r %))
([r m]
(get m r)))
(defn col
"Get a column of the table."
([c]
#(col c %))
([c m]
(for [[rk r] m
:let [x (get r c)]
:when x]
[rk x])))
(defn t-get
"Get values in a table."
[m &{:keys [r c]}]
(cond
(and r c) (get-in m [r c])
r (row r m)
c (col c m)
:else m))
(defn t-update
"Update a value or values in the map."
[m f &{:keys [r c]}]
(cond
(and r c) (update-in m [r c] f)
r (update-in m [r] f)
;; This O(n) column update is making me angry!
c (let [res (f (into {} (t-get m :c c)))]
(println "f result: " res)
(reduce
(fn [acc k]
(if-let [v (get res k)]
(update-in acc [k] assoc c v)
(if (contains? (get m k) c)
(update-in acc [k] dissoc c)
acc)))
m
(clojure.set/union (set (keys m))
(set (keys res)))))))
(defn t-set
"Set a value or values in the map."
[m v & r]
(apply t-update m (constantly v) r))
It works pretty well for swapping out rows or individual cells, but setting
a column seems like an inefficient operation. I don't know how much I'll be
using that.
On Thursday, 1 August 2013 17:59:40 UTC-7, JvJ wrote:
>
> I'm looking for an associative data structure that can be accessed by both
> rows and columns, and could potentially be sparse.
>
> Suppose the following table is called t:
>
> | | :A | :B | :C ||---+------+------+----------|| 1 | |
> | '[x y z] || 2 | "2a" | "2b" | || 3 | | | || 3 |
> :3a | | "Foo" |
>
>
> Then (t :A) would return {2 "2a", 3 :3a}, and (t 2) would return {:A "2a",
> :B "2b"}.
> (t :A 2) or (t 2 :A) would return "2a".
>
> I'm thinking of implementing it as a simple map of maps with some extra
> functions, but I'm not sure if
> that would be the best option.
>
>
>
--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.