medley
medley copied to clipboard
Add window function
I've had the lazy-only version of this function in quite a few codebases over the years, and recently took the time to write the transducer version. The cljs support is particularly annoying to write because cljs's array-list type doesn't implement a remove method.
This is like a simple alternative to https://github.com/cgrand/xforms/ 's window transducer, which needs f and invf functions to construct the windows. Plus this has a standard lazy-arity.
An example use case:
(def months [{:month "Jan" :income 500}
{:month "Feb" :income 450}
{:month "Mar" :income 580}
{:month "Apr" :income 420}
{:month "May" :income 680}])
(->> (window 3 months)
(map (fn [months]
{:month (:month (last months))
:last-3-avg (/ (reduce (fn [acc x] (+ (:income x) acc)) 0 months)
(count months))})))
;; => ({:month "Jan", :last-3-avg 500}
;; {:month "Feb", :last-3-avg 475}
;; {:month "Mar", :last-3-avg 510}
;; {:month "Apr", :last-3-avg 483}
;; {:month "May", :last-3-avg 560})
Sorry for the delay @weavejester - I've corrected the added metadata, and assume the benchmarking is satisfactory? Cheers
I probably won't be able to look at this in depth for a couple of weeks due to conference organizing. I wanted to let you know that this is on my radar though.
No worries. reClojure by any chance? If so, I'll see you there!
That's the one!
I think all looks good. Can you squish down the commits?
All squished. lmk if you need anything else. Cheers
Hi @weavejester can you cut a release when you get a chance please?
Hi @weavejester can you cut a release when you get a chance please?
Released 1.9.0. Sorry for the delay.
No worries, thank you!