Posted to tcl by aspect at Sat Jul 07 17:35:24 GMT 2018view raw

  1. namespace eval async {
  2. proc read {chan {numChars ""}} {
  3. if {[chan configure $chan -blocking]} {
  4. tailcall ::read $chan {*}$numChars
  5. } else {
  6. set was [chan event $chan readable]
  7. chan event $chan readable [list [info coroutine]]
  8. finally [list chan event $chan readable $was]
  9. if {$numChars eq ""} {
  10. yield
  11. return [::read $chan]
  12. } else {
  13. set data ""
  14. while {[string length $data] < $numChars} {
  15. yield
  16. append data [::read $chan $numChars]
  17. if {[eof $chan]} break
  18. }
  19. return $data
  20. }
  21. }
  22. }
  23. }