;; -*- lexical-binding: t; -*-
(require 'sly)

(define-sly-contrib sly-retro
  "Enable SLIME to connect to a SLY-started SLYNK"
  (:slynk-dependencies slynk/retro)
  (:on-load (setq sly-net-send-translator #'sly-retro-slynk-to-swank))
  (:on-unload (setq sly-net-send-translator nil)))

(defun sly-retro-slynk-to-swank (sexp)
  (cond ((and sexp
              (symbolp sexp)
              (string-match "^slynk\\(.*\\)$" (symbol-name sexp)))
         (intern (format "swank%s" (match-string 1 (symbol-name sexp)))))
        ((and sexp (listp sexp))
         (cl-loop for (x . rest) on sexp
                  append (list (sly-retro-slynk-to-swank x)) into foo
                  finally (return (append foo (sly-retro-slynk-to-swank rest)))))
        (t
         sexp)))

(provide 'sly-retro)