(load-relative "sig.ss")
(reference-library "function.ss")
(define main@
  (let ([foldl foldl])
    (unit/sig ()
      (import top^ (fname))
      (define-values (file-scores1 file-scores2)
		     (let* ([input (open-input-file fname)]
			    [v (lambda () (map (lambda (x)
						 (cons (symbol->string (car x))
						       (cdr x)))
					       (read input)))])
		       (begin0 (values (v) (v))
			       (close-input-port input))))
      (define (score1 result)
	(modulo (add1 result) 3)) ; 0 -> 1 tie, 1 -> 2 win, 2 -> 0 loss
      (define (score2 result)
	(- 2 (score1 result)))
      (for-each
       (lambda (file-score1)
	 (for-each
	  (lambda (file-score2)
	    (let* ([file1 (car file-score1)]
		   [file2 (car file-score2)]
		   [result1 (run file1 file2)]
		   [result2 (run file2 file1)])
	      (set-cdr! file-score1 (+ (cdr file-score1)
				       (score1 result1)
				       (score2 result2)))
	      (set-cdr! file-score2 (+ (cdr file-score2)
				       (score2 result1)
				       (score1 result2)))))
	  file-scores2))
       file-scores1)
      (printf "Results:~n~a" (append! file-scores1 file-scores2)))))

(if (>= (vector-length argv) 4)
    (let* ([arg (lambda (n) (vector-ref argv n))]
	   [a0   (arg 0)]
	   [a1   (arg 1)]
	   [a2  (arg 2)]
	   [a3  (arg 3)])
      (invoke-unit/sig
       (compound-unit/sig (import)
	 (link (ARGS : bigger^ ((unit/sig bigger^ (import)
				  (define size (string->number a0))
				  (define secs (string->number a1))
				  (define quiet (string=? a2 "quiet"))
				  (define fname a3))))
	       (COM : top^ ((load-relative "common.ss") (ARGS : args^)))
	       (M : () (main@ COM (ARGS : (fname)))))
	 (export))))
    (fprintf (current-error-port) "Program expects args: board-size timeout-secs quiet names-file~n"))
(exit)
