(use gauche.parseopt)
(use gauche.selector)
(use util.queue)

(define (main args)
  (let-args (cdr args)
      ((nlines "n=n" 10)
       (f? "f" #f)
       . argv)
    (call-with-input-file (car argv)
      (lambda (iport)
        (let ((q (make-queue)))
          (let loop ((n 0)
                     (line (read-line iport)))
            (unless (or (= n nlines) (eof-object? line))
              (enqueue! q line)
              (loop (+ n 1) (read-line iport))))
          (do ((line (read-line iport) (read-line iport)))
              ((eof-object? line))
            (enqueue! q line)
            (dequeue! q))
          (for-each print (queue->list q)))
        (when f?
          (with-signal-handlers ((SIGINT => (lambda _ (exit 0))))
            (lambda ()
              (let ((sel (make <selector>)))
                (selector-add! sel
                               iport
                               (lambda (input _)
                                 (and-let* ((line (read-line input))
                                            ((not (eof-object? line))))
                                   (print line))
                                 (sys-sleep 1))
                               '(r))
                (while #t (selector-select sel))))))
        0))))
