{ lib }: with lib; let isSymbol = str: !(isNull (builtins.match "^'.+" str)); stripQuote = str: if (isSymbol str) then head (builtins.match "^'(.+)" str) else str; parseStr = str: if (isSymbol str) then (stripQuote str) else ''"${str}"''; parseKeyword = 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 (mapAttrsToList (k: v: "${parseKeyword k} ${toEDN v}") ds) } }" else throw "unsupported type: ${builtins.typeOf ds}: ${ds}"))); in ds: toEDN ds