summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--init.fnl2
-rw-r--r--macros.fnl20
-rw-r--r--tests/test.fnl55
3 files changed, 37 insertions, 40 deletions
diff --git a/init.fnl b/init.fnl
index 567ee4f..1b84cda 100644
--- a/init.fnl
+++ b/init.fnl
@@ -960,7 +960,7 @@ functions also reuse this indexing method, such as sets."
:else
false))
([x y & xs]
- (reduce #(and $1 $2) (eq x y) (mapv #(eq x $) xs)))))
+ (and (eq x y) (apply eq x xs)))))
(set core.eq (with-meta eq {:fnl/docstring "Deep compare values.
diff --git a/macros.fnl b/macros.fnl
index ca31d58..c7a42b9 100644
--- a/macros.fnl
+++ b/macros.fnl
@@ -64,12 +64,12 @@
;;
;; 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#)
+ `(fn eq# [x# y#]
+ (if (= x# y#)
true
- (and (= (type left#) :table) (= (type right#) :table))
- (do (var [res# count-a# count-b#] [true 0 0])
- (each [k# v# (pairs left#)]
+ (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#)]
@@ -77,14 +77,14 @@
(set res# v#)
(lua :break)))
res#)
- right# k#)))
- (set count-a# (+ count-a# 1))
+ y# k#)))
+ (set count-x# (+ count-x# 1))
(when (not res#)
(lua :break)))
(when res#
- (each [_# _# (pairs right#)]
- (set count-b# (+ count-b# 1)))
- (set res# (= count-a# count-b#)))
+ (each [_# _# (pairs y#)]
+ (set count-y# (+ count-y# 1)))
+ (set res# (= count-x# count-y#)))
res#)
:else
false)))
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