diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-01-29 21:53:16 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-01-29 21:53:16 +0000 |
commit | e0d36eb1e7d29892a46ed48c5c44ba8046e33571 (patch) | |
tree | 29573fabd3334f15aa0deef5b407cb4222995ed9 /src | |
parent | aa7ccdb5cfa4067dddef8c189721af99d858c731 (diff) |
simple inspector support
Diffstat (limited to 'src')
-rw-r--r-- | src/inspector.clj | 99 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentMap.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentVector.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/MapEntry.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentHashMap.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentTreeMap.java | 3 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 4 |
7 files changed, 122 insertions, 0 deletions
diff --git a/src/inspector.clj b/src/inspector.clj new file mode 100644 index 00000000..ec77eae8 --- /dev/null +++ b/src/inspector.clj @@ -0,0 +1,99 @@ +; Copyright (c) Rich Hickey. All rights reserved. +; The use and distribution terms for this software are covered by the +; Common Public License 1.0 (http://opensource.org/licenses/cpl.php) +; which can be found in the file CPL.TXT at the root of this distribution. +; By using this software in any fashion, you are agreeing to be bound by +; the terms of this license. +; You must not remove this notice, or any other, from this software. + +(in-ns 'inspector) +(clojure/refer 'clojure) + +(import '(javax.swing.tree TreeModel) + '(javax.swing.table TableModel) + '(javax.swing JTree JTable JScrollPane JFrame)) + +(defn atom? [x] + (not (instance? clojure.lang.IPersistentCollection x))) + +(defn collection-tag [x] + (cond + (instance? java.util.Map$Entry x) :entry + (instance? clojure.lang.IPersistentMap x) :map + (instance? clojure.lang.Sequential x) :seq + :atom)) + +(defmulti is-leaf collection-tag) +(defmulti get-child (fn [parent index] (collection-tag parent))) +(defmulti get-child-count collection-tag) + +(defmethod is-leaf :default [node] + (atom? node)) +(defmethod get-child :default [parent index] + (nth parent index)) +(defmethod get-child-count :default [parent] + (count parent)) + +(defmethod is-leaf :entry [e] + (is-leaf (val e))) +(defmethod get-child :entry [e index] + (get-child (val e) index)) +(defmethod get-child-count :entry [e] + (count (val e))) + +(defmethod get-child :map [m index] + (nth (seq m) index)) + +(defn tree-model [data] + (implement [TreeModel] + (getRoot [] data) + (addTreeModelListener [treeModelListener]) + (getChild [parent index] + (get-child parent index)) + (getChildCount [parent] + (get-child-count parent)) + (isLeaf [node] + (is-leaf node)) + (valueForPathChanged [path newValue]) + (getIndexOfChild [parent child] + -1) + (addTreeModelListener [treeModelListener]) + (removeTreeModelListener [treeModelListener]))) + + +(defn table-model [data] + (let [row1 (first data) + colcnt (count row1) + cnt (count data) + vals (if (instance? clojure.lang.IPersistentMap row1) vals identity)] + (implement [TableModel] + (addTableModelListener [tableModelListener]) + (getColumnClass [columnIndex] Object) + (getColumnCount [] colcnt) + (getColumnName [columnIndex] + (if (instance? clojure.lang.IPersistentMap row1) + (name (nth (keys row1) columnIndex)) + (str columnIndex))) + (getRowCount [] cnt) + (getValueAt [rowIndex columnIndex] + (nth (vals (nth data rowIndex)) columnIndex)) + (isCellEditable [rowIndex columnIndex] false) + (removeTableModelListener [tableModelListener])))) + +(defn inspect-tree [data] + (doto (new JFrame "Clojure Inspector") + (add (new JScrollPane (new JTree (tree-model data)))) + (setSize 400 600) + (setVisible true))) + +(defn inspect-table [data] + (doto (new JFrame "Clojure Inspector") + (add (new JScrollPane (new JTable (table-model data)))) + (setSize 400 600) + (setVisible true))) + +(export '(inspect-table inspect-tree)) + +;(inspect-tree {:a 1 :b 2 :c [1 2 3 {:d 4 :e 5 :f [6 7 8]}]}) +;(inspect-table [[1 2 3][4 5 6][7 8 9][10 11 12]]) + diff --git a/src/jvm/clojure/lang/APersistentMap.java b/src/jvm/clojure/lang/APersistentMap.java index b595a53b..807dfe9c 100644 --- a/src/jvm/clojure/lang/APersistentMap.java +++ b/src/jvm/clojure/lang/APersistentMap.java @@ -24,6 +24,10 @@ protected APersistentMap(IPersistentMap meta){ protected APersistentMap(){
}
+public String toString(){
+ return "<map: - " + count() + " items>";
+}
+
public IPersistentCollection cons(Object o){
if(o instanceof IMapEntry)
{
diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java index 712f90db..ede92bc4 100644 --- a/src/jvm/clojure/lang/APersistentVector.java +++ b/src/jvm/clojure/lang/APersistentVector.java @@ -22,6 +22,10 @@ public APersistentVector(IPersistentMap meta){ super(meta); } +public String toString(){ + return "<vector: - " + count() + " items>"; +} + public ISeq seq(){ if(count() > 0) return new Seq(this, 0); diff --git a/src/jvm/clojure/lang/MapEntry.java b/src/jvm/clojure/lang/MapEntry.java index e5fbd2e2..7ab5041a 100644 --- a/src/jvm/clojure/lang/MapEntry.java +++ b/src/jvm/clojure/lang/MapEntry.java @@ -28,6 +28,10 @@ public MapEntry(IPersistentMap meta, Object _key, Object _val){ this._val = _val;
}
+public String toString(){
+ return RT.entryString(_key, _val);
+}
+
public Object key(){
return _key;
}
diff --git a/src/jvm/clojure/lang/PersistentHashMap.java b/src/jvm/clojure/lang/PersistentHashMap.java index 1529691b..38fa551d 100644 --- a/src/jvm/clojure/lang/PersistentHashMap.java +++ b/src/jvm/clojure/lang/PersistentHashMap.java @@ -495,6 +495,10 @@ final static class LeafNode implements INode, IMapEntry, Map.Entry{ this.val = val; } + public String toString(){ + return RT.entryString(key, val); + } + public INode assoc(int shift, int hash, Object key, Object val, Box addedLeaf){ if(hash == this.hash) { diff --git a/src/jvm/clojure/lang/PersistentTreeMap.java b/src/jvm/clojure/lang/PersistentTreeMap.java index 5316c482..f9d27e08 100644 --- a/src/jvm/clojure/lang/PersistentTreeMap.java +++ b/src/jvm/clojure/lang/PersistentTreeMap.java @@ -419,6 +419,9 @@ static abstract class Node implements IMapEntry{ return null; } + public String toString(){ + return RT.entryString(key(), val()); + } public Object getKey(){ return key(); diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index c996b446..80f5bc02 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -386,6 +386,10 @@ static public Object find(Object coll, Object key){ return ((Associative) coll).entryAt(key); } +static public String entryString( Object key,Object val){ + return "<" + key + " " + val + ">"; +} + //takes a seq of key,val,key,val //returns tail starting at val of matching key if found, else null |