summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-01-29 21:53:16 +0000
committerRich Hickey <richhickey@gmail.com>2008-01-29 21:53:16 +0000
commite0d36eb1e7d29892a46ed48c5c44ba8046e33571 (patch)
tree29573fabd3334f15aa0deef5b407cb4222995ed9 /src
parentaa7ccdb5cfa4067dddef8c189721af99d858c731 (diff)
simple inspector support
Diffstat (limited to 'src')
-rw-r--r--src/inspector.clj99
-rw-r--r--src/jvm/clojure/lang/APersistentMap.java4
-rw-r--r--src/jvm/clojure/lang/APersistentVector.java4
-rw-r--r--src/jvm/clojure/lang/MapEntry.java4
-rw-r--r--src/jvm/clojure/lang/PersistentHashMap.java4
-rw-r--r--src/jvm/clojure/lang/PersistentTreeMap.java3
-rw-r--r--src/jvm/clojure/lang/RT.java4
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