(module collapsed-snipclass-helpers mzscheme
  (require (lib "mred.ss" "mred")
           (lib "class.ss"))
  
  (provide make-sexp-snipclass%)
  
  (define (make-sexp-snipclass% sexp-snip%)
    (class snip-class%
      (define/override (read in)
        (let* ([left-bracket (integer->char (bytes-ref (send in get-bytes) 0))]
               [right-bracket (integer->char (bytes-ref (send in get-bytes) 0))]
               [snip-count (send in get-exact)]
               [saved-snips
                (let loop ([n snip-count])
                  (cond
                    [(zero? n) null]
                    [else
                     (let* ([classname (bytes->string/utf-8 (send in get-bytes))]
                            [snipclass (send (get-the-snip-class-list) find classname)])
                       (cons (send snipclass read in)
                             (loop (- n 1))))]))])
          (instantiate sexp-snip% ()
            (left-bracket left-bracket)
            (right-bracket right-bracket)
            (saved-snips saved-snips))))
      (super-instantiate ()))))
  