diff options
| author | Andrey Orst <andreyorst@gmail.com> | 2020-11-13 18:57:32 +0300 |
|---|---|---|
| committer | Andrey Orst <andreyorst@gmail.com> | 2020-11-13 18:58:43 +0300 |
| commit | 7556afb32edacd532758d25651dfea2a4f94655a (patch) | |
| tree | 7e7e10c40faf296f1cbcb0629c3302b495714c77 /cljlib-macros.fnl | |
| parent | 368ecb9abf626de4dcad496db17b55b268997fc7 (diff) | |
fix(core): improved deep comparison
Diffstat (limited to 'cljlib-macros.fnl')
| -rw-r--r-- | cljlib-macros.fnl | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/cljlib-macros.fnl b/cljlib-macros.fnl index 90f2c54..667a570 100644 --- a/cljlib-macros.fnl +++ b/cljlib-macros.fnl @@ -482,16 +482,25 @@ namespaced functions. See `fn*' for more info." (fn eq-fn [] `(fn eq# [a# b#] (if (and (= (type a#) :table) (= (type b#) :table)) - (do (var [res# count-a# count-b#] [true 0 0]) - (each [k# v# (pairs a#)] - (set res# (eq# v# (. b# k#))) - (set count-a# (+ count-a# 1)) - (when (not res#) (lua :break))) - (when res# - (each [_# _# (pairs b#)] - (set count-b# (+ count-b# 1))) - (set res# (and res# (= count-a# count-b#)))) - res#) + (let [oldmeta# (getmetatable b#)] + (setmetatable b# {:__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 a#)] + (set res# (eq# v# (. b# k#))) + (set count-a# (+ count-a# 1)) + (when (not res#) (lua :break))) + (when res# + (each [_# _# (pairs b#)] + (set count-b# (+ count-b# 1))) + (set res# (= count-a# count-b#))) + (setmetatable b# oldmeta#) + res#) (= a# b#)))) (fn seq->table [seq] |