(fn ilerp* [a b c d x] (+ c (* (/ (- x a) (- b a)) (- d c)))) (fn add [a b] {:x (+ a.x b.x) :y (+ a.y b.y)}) (fn sub [a b] {:x (- a.x b.x) :y (- a.y b.y)}) (fn mul [v n] {:x (* v.x n) :y (* v.y n)}) (fn mag [v] (math.sqrt (+ (* v.x v.x) (* v.y v.y)))) (fn norm [v n] (mul v (/ (or n 1) (mag v)))) (fn wrap [a b] {:x (% a.x b.x) :y (% a.y b.y)}) (fn lerp [a b c d x] {:x (ilerp* a.x b.x c.x d.x x.x) :y (ilerp* a.y b.y c.y d.y x.y)}) (fn clone [v] {:x v.x :y v.y}) {: lerp : add : sub : mul : mag : wrap : norm : clone}