Функция tupelo.lexical / compare-generi c реализует компаратор, который безопасно использовать для различных типов. Вы можете объединить это с sorted-map-by
и sorted-set-by
, чтобы преобразовать все карты / наборы в стабильные версии, которые всегда печатаются в одном и том же порядке. Тогда сработает метод (sha (pr-str XXX))
.
Вышеприведенные логики c уже доступны в функции tupelo.core / unlazy . Функция tupelo.misc / str-> sha также делает то, что говорит на жестяной банке. Итак, теперь окончательным решением становится:
(ns demo.core
(:require
[tupelo.core :as t]
[tupelo.misc :as tm] ))
(tm/str->sha (pr-str (t/unlazy XXX)))
, где XXX
- любая коллекция Clojure. Демо-код:
(ns tst.demo.core
(:use tupelo.core tupelo.test)
(:require
[tupelo.core :as t]
[tupelo.misc :as tm]))
(dotest
(let [stuff {:hello "there"
1 [2 3 4]
"gooodbye" #{"cruel" :world}
'forever ['and "ever" :and #{"ever" 'more}]}
stuff-str (pr-str (t/unlazy stuff))
stuff-sha (tm/str->sha (pr-str (t/unlazy stuff)))]
(is= stuff-str
"{:hello \"there\", forever [and \"ever\" :and #{more \"ever\"}], 1 [2 3 4], \"gooodbye\" #{:world \"cruel\"}}")
(is= stuff-sha "af3ade069e7a33139f5ee1fd1d35fd82807e3b1c")))