On 8/2/13 8:08 PM, JvJ wrote:
> 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.
>>
>>
>>
> please, please, use clojure.set/index, it does what you want, better the code you shared. -- And what is good, Phaedrus, And what is not good— Need we ask anyone to tell us these things?
signature.asc
Description: OpenPGP digital signature
