#! /bin/sh
#|
exec ../../../plt/bin/racket -t "$0" ${1+"$@"}
|#

#lang racket

;; read XML element from STDIN, interpret and send response as XML to STDOUT 
;; raises error if request is invalid 

;; ---------------------------------------------------------------------------------------------------
;; IMPLEMENTATION

(require
  (except-in "../game.rkt" main)
  "../player.rkt"
  "../strategy.rkt"
  "../basics.rkt"
  "../xharness.rkt"
  "../Lib/xml.rkt")

;; Xexpr -> Xexpr 
(define interpret 
  (xml-parser (run-game ((rounds string->cash)) (p named-player-p) ... #:action (my-run rounds p))))

(define named-player-p (xml-parser (player ((name values)) #:action name)))

(define (my-run rounds p)
  (define players (for/list ((name p)) (create name ordered-s)))
  (define-values (status _) (run players rounds))
  status)

(define main (make-main interpret))
(define pr (make-process-request interpret))

(module+ main 
  (require (for-syntax "../Performance/with-contract.rkt"))
  (define-for-syntax _x (displayln `(running with contracts: ,with-contracts)))
  (define-for-syntax _y (displayln `(running with options: ,with-options)))
  
  ;; String *-> [Listof Xexpr]
  (define (players . lop)
    (for/list ((p lop)) `(player ((name ,p)))))
  
  (define ROUNDS "44")

  (collect-garbage) (collect-garbage) (collect-garbage) 
  (let-values ([(res cpu real sys)
                (time-apply
                 (λ ()
                   (begin 
                     (tee 'one (pr `(run-game ((rounds ,ROUNDS)) ,@(players "a" "b" "c"))))
                     (tee 'two (pr `(run-game ((rounds ,ROUNDS)) ,@(players "a" "b" "c" "d"))))
                     (tee 'thr (pr `(run-game ((rounds ,ROUNDS)) ,@(players "a" "b" "c" "d" "e"))))
                     (tee 'for (pr `(run-game ((rounds ,ROUNDS)) ,@(players "a" "b" "c" "d" "e" "f"))))))
                 '())])
    cpu))
