{ lib }: with lib; let isSymbol = str: isNull (match "^'.+" str); stripQuote = head (match "^'(.+)"); parseStr = str: if (isSymbol str) then (stripQuote str) else ''"${str}"''; join-str = concatStringsSep " "; toEDN = ds: if isString ds then parseStr ds else (if isInt ds then ds else (if isList ds then "[ ${join-str (map toEDN ds)} ]" else (if isAttrs ds then "{ ${join-str (mapAttrs (k: v: ":${k} ${toEDN v}") ds)} }" else throw "unsupported type: ${builtins.typeOf ds}: ${ds}"))); in { ds }: toEDN ds