Restrict scope of temp variables
[tt.git] / tt.rkt
diff --git a/tt.rkt b/tt.rkt
index b11364f..be88095 100644 (file)
--- a/tt.rkt
+++ b/tt.rkt
@@ -34,6 +34,9 @@
 ; - d | download
 ; - u | upload
 ;   - calls user-configured command to upload user's own feed file to their server
+;
+; Looks like a better CLI parser than "racket/cmdline":
+; https://docs.racket-lang.org/natural-cli/
 
 #lang racket
 
 (require http-client)
 (require rfc3339-old)
 
+(module+ test
+  (require rackunit))
+
 (struct msg  (ts_epoch ts_rfc3339 nick uri text))
 (struct feed (nick uri))
 
 (define (concurrent-filter-map num_workers f xs)
+  ; TODO preserve order of elements OR communicate that reorder is expected
   ; TODO switch from mailboxes to channels
   (define (make-worker id f)
     (define parent (current-thread))
   (for-each thread-wait threads)
   results)
 
+(module+ test
+  (define n-workers 10)
+  (define given (list
+                  (λ (x) (if (even? x) x #f))
+                  (range 11)))
+  (check-equal?
+    (sort (apply concurrent-filter-map (cons n-workers given)) <)
+    (sort (apply            filter-map                 given ) <)))
+
 (define (msg-print out-format odd msg)
   (printf
     (match out-format
     "https://raw.githubusercontent.com/mdom/we-are-twtxt/master/we-are-twtxt.txt")
   (str->feeds (uri-fetch uri)))
 
-(define user-agent
+(define (user-agent prog-name prog-version)
   (let*
-    ([prog-name      "tt"]
-     [prog-version   "0.3.4"]
-     [prog-uri       "https://github.com/xandkar/tt"]
+    ([prog-uri       "https://github.com/xandkar/tt"]
      [user-feed-file (expand-user-path "~/twtxt-me.txt")]
      [user
        (if (file-exists? user-feed-file)
     (format "~a/~a (~a)" prog-name prog-version user)))
 
 (module+ main
-  (define (setup-logging)
-    (define logger (make-logger #f #f 'debug #f))
-    (define log-chan (make-log-receiver logger 'debug))
+  (require setup/getinfo)
+
+  (let* ([logger       (make-logger #f #f 'debug #f)]
+         [log-receiver (make-log-receiver logger 'debug)])
     (void (thread (λ ()
                      [date-display-format 'iso-8601]
                      [let loop ()
-                       (define data  (sync log-chan))
+                       (define data  (sync log-receiver))
                        (define level (vector-ref data 0))
                        (define msg   (vector-ref data 1))
                        (define ts    (date->string (current-date) #t))
                        (eprintf "~a [~a] ~a~n" ts level msg)
                        (loop)])))
     (current-logger logger))
-
-  (setup-logging)
   (current-http-response-auto #f)
-  (current-http-user-agent user-agent)
+  (let* ([prog-name    "tt"]
+         [prog-version ((get-info (list prog-name)) 'version)]
+         [user-agent   (user-agent prog-name prog-version)])
+    (current-http-user-agent user-agent))
   (date-display-format 'rfc2822)
-
-  (define args (current-command-line-arguments))
-  (define feeds
-    (if (vector-empty? args)
-      (we-are-twtxt)
-      (file->feeds (vector-ref args 0))))
-  (define out-format 'multi-line)
-  (define num_workers 15) ; 15 was fastest out of the tried 1, 5, 10, 15 and 20.
-  (timeline-print out-format (timeline num_workers feeds)))
+  (let ([feeds
+          (let ([args (current-command-line-arguments)])
+            (if (= 0 (vector-length args))
+              (we-are-twtxt)
+              (file->feeds (vector-ref args 0))))]
+        [out-format
+          'multi-line]
+        [num_workers
+          15]) ; 15 was fastest out of the tried 1, 5, 10, 15 and 20.
+    (timeline-print out-format (timeline num_workers feeds))))
This page took 0.029786 seconds and 4 git commands to generate.