This page has some type implementations in the framework mentioned in OO libraries.
Summary
The subtypes of this type need to provide the implementations for open, close, read, seek, tell. It presently provides foreach implementation.
foreach - foreach <obj> <picked_item> <block to act on picked item>
Usage
dir create a /tmp # object creation
> read a # reads the current item in the stream
> foreach a item { puts $item } # foreach is the iterator for the stream items.Modified proc ">"
proc > { args } {
set obj [lindex $args 1 ]
upvar $obj myobj
set handler $myobj(handler)
set myobj(level) [ expr [info level] - 1 ]
lvarpop args 1
lvarpush args myobj 1
$handler $args
}Type implementations:
Dir - type
package require Tclx
proc dir { args } {
if {! [ string equal [lindex $args 0] create ] } {
set args [lindex $args 0]
}
set ref [lindex $args 1 ]
set action [lindex $args 0]
upvar $ref myref
switch $action {
create {
array set myref [list handler dir]
array set myref [list dir [lindex $args 2 ]]
array set myref [list items [ glob $myref(dir)/* ] ]
array set myref [list position -1 ]
}
open {
array set myref [list position -1 ]
}
read {
set pres_elem {}
set max_position [ expr [llength $myref(items)] - 1 ]
if { $myref(position) < $max_position } {
incr myref(position)
set pres_elem [ lindex $myref(items) $myref(position) ]
}
return $pres_elem
}
seek {
set index [lindex $args 2 ]
if {$index < [ llength $myref(items)]} {
array set myref [list position [lindex $args 2] ]
}
}
tell {
return $myref(position)
}
close {
array set myref [list position -1 ]
}
default {
lvarpop args 1
lvarpush args myref 1
set myargs $args
stream $myargs
}
}
}Stream - type
proc stream { myargs } {
set args $myargs
set ref [lindex $args 1 ]
set action [lindex $args 0]
upvar $ref myref
set handler $myref(handler)
switch $action \
foreach {
$handler {open myref}
while 1 {
set item [ $handler {read myref} ]
if { $item != {} } {
upvar $myref(level) [lindex $args 2 ] elem
set elem $item
uplevel $myref(level) [lindex $args 3 ]
} else {
break ;
}
}
}
}