Login
7 branches 0 tags
Ben (Win10) Fixed exception handling closures not being poped from the stack 8b1fa21 3 years ago 631 Commits
nujel / stdlib / collections / tree.nuj
;; Nujel - Copyright (C) 2020-2021 - Benjamin Vincent Schulenburg
;; This project uses the MIT license, a copy should be included under /LICENSE

;; Some functions about trees

[defn tree/zip [keys values]
  "Return a tree where KEYS point to VALUES"
  [def ret @[]]
  [for-in [key keys]
	  [tree/set! ret key [car values]]
	  [cdr! values]]
  ret]

[defn tree/+= [t k v]
  "Increment value at K in T by V"
  [tree/set! t k [+ v [int [or [tree/ref t k] 0]]]]]

[defmacro tree/-= [t k v]
  "Decrement value at K in T by V"
  `[tree/+= ~t ~k [- ~v]]]

[defmacro tree/++ [t k]
  "Increment value at K in T by 1"
  `[tree/+= ~t ~k 1]]

[defmacro tree/-- [t k]
  "Increment value at K in T by 1"
  `[tree/-= ~t ~k 1]]

[defn tree/equal? [a b]
  "Compares two trees for equality"
  [if [and [tree? a]
           [tree? b]]
      [and [== [tree/key* a]
               [tree/key* b]]
           [equal? [tree/value* a]
                   [tree/value* b]]
           [tree/equal? [tree/left* a]
                        [tree/left* b]]
           [tree/equal? [tree/right* a]
                        [tree/right* b]]]
      [equal? a b]]]

[defn tree/reduce [l o s]
  "Combine all elements in l using operation o and starting value s"
  [list/reduce [tree/values l] o s]]

[defn tree/filter [l f]
  "Return a new tree with all elements from L where F retunrs true"
  [def ret @[]]
  [for-in [e [tree/keys l]]
          [def t [tree/ref l e]]
          [when [f t]
            [tree/set! ret e t]]]
  ret]