(load "../common")

(defstruct refcount-close stream-wrap
  stream
  (count 1)

  (:method close (me throw-on-error-p)
    (put-line `close called, count @{me.count}`)
    (when (plusp me.count)
      (if (zerop (dec me.count))
        (close-stream me.stream throw-on-error-p)))))

(flow
  (with-stream (s (make-struct-delegate-stream
                    (new refcount-close
                         count 2
                         stream (open-file *load-path*))))
    (get-lines s))
  len
  prinl)

(defstruct refcount-close-alt stream-wrap
  stream
  (count 1)

  (:method close (me throw-on-error-p)
    (put-line `close called, count @{me.count}`)
    (when (plusp me.count)
      (if (zerop (dec me.count))
        (close-stream me.stream throw-on-error-p)
        :))))

(flow
  (with-stream (s (make-struct-delegate-stream
                    (new refcount-close-alt
                         count 2
                         stream (open-file *load-path*))))
    (get-lines s))
  len
  prinl)