X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=tt.rkt;h=e93c26f4a20e67426ec608c863204e638dead67f;hb=HEAD;hp=cbc5b7ae06ae40c8eda0ea895ae9e9bed93c1ace;hpb=1ecda371d6331ae339a9341acfe6a4b528622ad8;p=tt.git diff --git a/tt.rkt b/tt.rkt index cbc5b7a..e93c26f 100644 --- a/tt.rkt +++ b/tt.rkt @@ -166,29 +166,19 @@ (: peers-merge (-> (Listof Peer) * (Listof Peer))) (define (peers-merge . peer-sets) - (define groups - (foldl - (λ (p groups) - (hash-update groups (Peer-url-str p) (λ (group) (cons p group)) '())) - (hash) - (append* peer-sets))) - (define (merge peers) + (define (merge-2 p1 p2) + (match* (p1 p2) + [((Peer n1 _ _ _) (Peer n2 _ _ _)) #:when (and n1 n2) p1] ; TODO compare which is more-common? + [((Peer #f _ _ _) (Peer #f _ _ _)) p1] ; TODO update with most-common nick? + [((Peer n1 _ _ _) (Peer #f _ _ _)) p1] + [((Peer #f _ _ _) (Peer n2 _ _ _)) p2])) + (: merge-n (-> (Listof Peer) Peer)) + (define (merge-n peers) (match peers ['() (raise 'impossible)] [(list p) p] - [(list* p1 p2 ps) - (let* ([n1 (Peer-nick p1)] - [n2 (Peer-nick p2)] - [p (cond - ; TODO Try to pick from nicks db: preferred, otherwise seen - [(and (not n1) (not n2)) p1] ; TODO update with most-common nick - [(and n1 n2 ) p1] ; TODO compare which is more-common - [(and n1 (not n2)) p1] - [(and (not n1) n2) p2] - [else - (raise 'impossible)])]) - (merge (cons p ps)))])) - (sort (map merge (hash-values groups)) + [(list* p1 p2 ps) (merge-n (cons (merge-2 p1 p2) ps))])) + (sort (map merge-n (group-by Peer-url-str (append* peer-sets))) (match-lambda** [((Peer _ _ u1 _) (Peer _ _ u2 _)) (stringnumber njobs))] + positive-integer "Number of concurrent jobs." + (set! num-workers + (assert (string->number positive-integer) + (conjoin exact-positive-integer?)))] [("-t" "--timeout") - seconds "Timeout seconds per request." - (set! timeout (string->number seconds))] + positive-float "Timeout seconds per request." + (set! timeout + (assert (string->number positive-float) + (conjoin positive? flonum?)))] #:args file-paths (download file-paths num-workers timeout)))] [(or "u" "upload")