diff options
Diffstat (limited to 'tests/test.fnl')
| -rw-r--r-- | tests/test.fnl | 55 |
1 files changed, 26 insertions, 29 deletions
diff --git a/tests/test.fnl b/tests/test.fnl index 2d9293a..7941f2c 100644 --- a/tests/test.fnl +++ b/tests/test.fnl @@ -1,36 +1,33 @@ (local test {}) (fn eq-fn [] - "Returns recursive equality function. - -This function is able to compare tables of any depth, even if one of -the tables uses tables as keys." - `(fn eq# [left# right#] - (if (= left# right#) + ;; Returns recursive equality function. + ;; + ;; This function is able to compare tables of any depth, even if one of + ;; the tables uses tables as keys. + `(fn eq# [x# y#] + (if (= x# y#) true - (and (= (type left#) :table) (= (type right#) :table)) - (let [oldmeta# (getmetatable right#)] - ;; In case if we'll get something like - ;; (eq {[1 2 3] {:a [1 2 3]}} {[1 2 3] {:a [1 2 3]}}) - ;; we have to do even deeper search - (setmetatable right# {:__index (fn [tbl# key#] - (var res# nil) - (each [k# v# (pairs tbl#)] - (when (eq# k# key#) - (set res# v#) - (lua :break))) - res#)}) - (var [res# count-a# count-b#] [true 0 0]) - (each [k# v# (pairs left#)] - (set res# (eq# v# (. right# k#))) - (set count-a# (+ count-a# 1)) - (when (not res#) (lua :break))) - (when res# - (each [_# _# (pairs right#)] - (set count-b# (+ count-b# 1))) - (set res# (= count-a# count-b#))) - (setmetatable right# oldmeta#) - res#) + (and (= (type x#) :table) (= (type y#) :table)) + (do (var [res# count-x# count-y#] [true 0 0]) + (each [k# v# (pairs x#)] + (set res# (eq# v# ((fn deep-index# [tbl# key#] + (var res# nil) + (each [k# v# (pairs tbl#)] + (when (eq# k# key#) + (set res# v#) + (lua :break))) + res#) + y# k#))) + (set count-x# (+ count-x# 1)) + (when (not res#) + (lua :break))) + (when res# + (each [_# _# (pairs y#)] + (set count-y# (+ count-y# 1))) + (set res# (= count-x# count-y#))) + res#) + :else false))) (fn test.assert-eq |