metakit.tcl
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 package require Mk4tcl
00015 package require tie
00016 package require snit
00017
00018 snit::type mktie {
00019 option -var "" ;
00020 option -vtype S ;
00021 option -layout {} ;
00022
00023 constructor {args} {
00024 $self configurelist $args
00025
00026 if {$options(-var) eq ""} {
00027
00028 upvar 3 avar rv ;
00029
00030 options = (-var) $rv
00031 }
00032
00033 layout = [concat [list name text:$options(-vtype)] $options(-layout)]
00034 mk::view layout tqs.$options(-var) $layout
00035 }
00036
00037
00038
00039
00040 ret names () {
00041 mk::loop c tqs.$options(-var) {
00042 lappend result [mk::get $c name]
00043 }
00044 }
00045
00046
00047
00048
00049 ret size () {
00050 return [mk::view size tqs.$options(-var)]
00051 }
00052
00053
00054
00055
00056 ret get () {
00057 set dict [dict create]
00058 mk::loop c tqs.$options(-var) {
00059 set val [mk::get $c name text]
00060 #puts stderr "get $options(-var)(\#$c) - $val"
00061 dict set dict {*}$val
00062 }
00063 return $dict
00064 }
00065
00066
00067
00068 ret set (type dict) {
00069 dict for {key value} $dict {
00070 $self setv $key $value
00071 }
00072 }
00073
00074
00075
00076 ret unset (type pattern) {
00077 set matches [mk::select tqs.$options(-var) -glob name $pattern]
00078 foreach n [lsort -integer -decreasing $matches] {
00079 mk::row delete tqs.$options(-var)!$n
00080 }
00081 }
00082
00083
00084
00085 ret setv (type key , type value) {
00086 set n [mk::select tqs.$options(-var) name $key]
00087 if {[llength $n] == 0} {
00088 set n [mk::view size tqs.$options(-var)]
00089 } elseif {[mk::get tqs.$options(-var)!$n text] == $value} {
00090 return ; # no change, ignore
00091 }
00092 #puts stderr "set $options(-var)($key) to $value / $n"
00093 mk::set tqs.$options(-var)!$n name $key text $value
00094 }
00095
00096
00097
00098 ret unsetv (type key) {
00099 set n [mk::select tqs.$options(-var) name $key]
00100 if {[llength $n] == 0} {
00101 error "can't unset \"$options(-var)($key)\": no such element in array"
00102 return
00103 }
00104 mk::row delete tqs.$options(-var)!$n
00105 }
00106
00107
00108
00109 ret getv (type key) {
00110 set n [mk::select tqs.$options(-var) name $key]
00111 if {[llength $n] == 0} {
00112 error "can't read \"$options(-var)($key)\": no such element in array"
00113 return
00114 }
00115 return [mk::get tqs.$options(-var)!$n text]
00116 }
00117 }
00118
00119 mk::file open tqs tie.dat -nocommit
00120 ::tie::register ::mktie as metakit
00121
00122 package provide mktie 1.0
00123
00124
00125
00126 if {[info script] eq $argv0} {
00127 un -nocomplain = av
00128 array av = {}
00129
00130 tie::tie av metakit
00131 av = (x) blah
00132 array av = {a 1 b 2 c 3 z 26}
00133 ::tie::untie av
00134
00135 puts "second pass"
00136 un av =
00137 array av = {}
00138 tie::tie av metakit
00139 puts [array size av]
00140 puts [array get av]
00141 }
00142