git.fiddlerwoaroof.com
type-providers.lisp
e9ecaa59
 (defpackage :type-providers
   (:use :cl )
   (:export ))
 (in-package :type-providers)
 
 (defun load-keys (file)
   (fset:reduce 'fset:union
                (fset:image 'fset:domain
                            (edn:parse (alexandria:read-file-into-string file)
                                       'edn:fset-lossy))))
 
 (define-condition non-exhaustive-switch (style-warning)
   ((keys :initarg :keys :reader nes-keys)
    (cases :initarg :cases :reader nes-cases))
   (:report (lambda (c s)
              (format s "Missing cases: ~s"
                      (fset:set-difference (nes-keys c)
                                           (fset:convert 'fset:set (nes-cases c)))))))
 
 (defmacro field-switch ((s file) &body body)
   (let* ((keys (load-keys file)))
     `(lambda (,s)
        (let (,@(fset:convert 'list
                              (fset:image (lambda (x)
                                            `(,(intern (symbol-name x)
                                                       *package*)
                                               (fset:lookup ,s ,x)))
                                          keys)))
          ,@body))))
 
 (field-switch (s "types.edn")
   )