#lang racket/base (require racket/list keystore "util.rkt") (provide open-flac2opus-state flac2opus-state-get-file flac2opus-state-set-file! flac2opus-state-drop-file! flac2opus-state-known-relpaths) (define prefix "flac2opus:file:") (define (open-flac2opus-state state-file) (ks-open state-file)) (define (file-state-key relpath) (string-append prefix (normalize-relpath-string relpath))) (define (legacy-file-state-key relpath) (string-append prefix (legacy-backslash-relpath-string relpath))) (define (ks-drop/quiet! ks key) (with-handlers ([exn:fail? (lambda (_) (void))]) (ks-drop! ks key))) (define (flac2opus-state-get-file ks relpath [default #f]) (define key (file-state-key relpath)) (define legacy-key (legacy-file-state-key relpath)) (define missing (gensym 'missing)) (define value (ks-get ks key missing)) (cond [(not (eq? value missing)) value] [(equal? key legacy-key) default] [else (ks-get ks legacy-key default)])) (define (flac2opus-state-set-file! ks relpath value) (define key (file-state-key relpath)) (define legacy-key (legacy-file-state-key relpath)) (ks-set! ks key value) (unless (equal? key legacy-key) (ks-drop/quiet! ks legacy-key))) (define (flac2opus-state-drop-file! ks relpath) (define key (file-state-key relpath)) (define legacy-key (legacy-file-state-key relpath)) (ks-drop/quiet! ks key) (unless (equal? key legacy-key) (ks-drop/quiet! ks legacy-key))) (define (flac2opus-state-known-relpaths ks) (remove-duplicates (map (lambda (k) (normalize-relpath-string (substring k (string-length prefix)))) (ks-keys-glob ks (string-append prefix "*"))) equal?))