(define digit (in char-set:digit)) (define (as-number parser) (bind (as-string parser) (lambda (s) (result (string->number s))))) (define digits (as-number (one-or-more digit))) (define (number-unit suffix) (sequence* ((number digits) (_ (is suffix))) (result number))) (define timestamp-hours (number-unit #\h)) (define timestamp-minutes (number-unit #\m)) (define timestamp-seconds (number-unit #\s)) (define timestamp (sequence* ((hours (maybe timestamp-hours 0)) (minutes (maybe timestamp-minutes 0)) (seconds timestamp-seconds)) (result (list hours minutes seconds)))) (define (parse-timestamp input) (parse (followed-by timestamp end-of-input) input)) (parse-timestamp "1s") ;=> (0 0 1) (parse-timestamp "1m2s") ;=> (0 1 2) (parse-timestamp "1h2m3s") ;=> (1 2 3) (define (timestamp-to-seconds timestamp) (if timestamp (+ (* (car timestamp) 60 60) (* (cadr timestamp) 60) (list-ref timestamp 2)) 0)) (timestamp-to-seconds (parse-timestamp "1y")) ;=> 0 (timestamp-to-seconds (parse-timestamp "1s")) ;=> 1 (timestamp-to-seconds (parse-timestamp "1m2s")) ;=> 62 (timestamp-to-seconds (parse-timestamp "1h2m3s")) ;=> 3723