From 7556afb32edacd532758d25651dfea2a4f94655a Mon Sep 17 00:00:00 2001 From: Andrey Orst Date: Fri, 13 Nov 2020 18:57:32 +0300 Subject: fix(core): improved deep comparison --- cljlib-macros.fnl | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'cljlib-macros.fnl') 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] -- cgit v1.2.3