byteslike.ss
(module byteslike mzscheme
  (provide (all-defined))

  ;; A byteslike value is one of
  ;;   - bytes
  ;;   - string

  ;; byteslike? : any -> boolean
  (define (byteslike? v)
    (or (bytes? v) (string? v)))
  
  ;; byteslike->bytes : (union bytes string) -> bytes
  (define (byteslike->bytes x)
    (cond [(bytes? x) x]
          [(string? x) (string->bytes/utf-8 x)]
          [else (raise-type-error 'byteslike->bytes "byteslike" x)]))
  
  ;; byteslike->string : (union bytes string) -> string
  (define (byteslike->string x)
    (cond [(string? x) x]
          [(bytes? x) (bytes->string/utf-8 x)]
          [else (raise-type-error 'byteslike->string "byteslike" x)]))
  
  ;; byteslike-append : byteslike ... -> byteslike
  (define (byteslike-append . items)
    (apply bytes-append (map byteslike->bytes items)))
  )