Skip to content

Instantly share code, notes, and snippets.

@lagenorhynque
Created March 20, 2018 11:47
Show Gist options
  • Select an option

  • Save lagenorhynque/8131b7148451de4707280559f5f7ca2a to your computer and use it in GitHub Desktop.

Select an option

Save lagenorhynque/8131b7148451de4707280559f5f7ca2a to your computer and use it in GitHub Desktop.
cljs.user> (defprotocol INode
(entry [this])
(left [this])
(right [this])
(contains-value? [this v])
(insert-value [this v]))
nil
cljs.user> (declare ->Node)
#'cljs.user/->Node
cljs.user> (deftype Node [val l r]
INode
(entry [_] val)
(left [_] l)
(right [_] r)
(contains-value? [this v]
(cond
(= v val) true
(< v val) (contains-value? l v)
(> v val) (contains-value? r v)))
(insert-value [this v]
(cond
(= v val) this
(< v val) (->Node val (insert-value l v) r)
(> v val) (->Node val l (insert-value r v)))))
cljs.user/Node
cljs.user> (extend-protocol INode
nil
(entry [_] nil)
(left [_] nil)
(right [_] nil)
(contains-value? [_ _] false)
(insert-value [_ v] (->Node v nil nil)))
nil
cljs.user> (def root (->Node 7 nil nil))
#'cljs.user/root
cljs.user> (left root)
nil
cljs.user> (right root)
nil
cljs.user> (entry root)
7
cljs.user> (contains-value? root 5)
false
cljs.user> (def root (->Node 7 (->Node 5 (->Node 3 nil nil) nil) (->Node 12 (->Node 9 nil nil) (->Node 17 nil nil))))
#'cljs.user/root
cljs.user> (entry (left root))
5
cljs.user> (entry (left (left root)))
3
cljs.user> (entry (right root))
12
cljs.user> (entry (right (right root)))
17
cljs.user> (def l (insert-value root 6))
#'cljs.user/l
cljs.user> (entry (right (left l)))
6
cljs.user> (identical? (left root) (left l))
false
cljs.user> (identical? (right root) (right l))
true
cljs.user> (identical? (left (left root)) (left (left l)))
true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment