Better nanmin and nanmax functions

This commit is contained in:
Dimitri Lozeve 2021-10-24 20:36:28 +02:00
parent 5426c11ef1
commit f9719d087e

View file

@ -12,11 +12,11 @@
(def +default-colors+ '(green blue red yellow cyan magenta white)) (def +default-colors+ '(green blue red yellow cyan magenta white))
(def (nanmin . rest) (def (nanmin lst)
(apply min (filter finite? rest))) (for/fold (xmin +inf.0) (x lst when (finite? x)) (min xmin x)))
(def (nanmax . rest) (def (nanmax lst)
(apply max (filter finite? rest))) (for/fold (xmax -inf.0) (x lst when (finite? x)) (max xmax x)))
(def (scale-fn lo hi) (def (scale-fn lo hi)
(lambda (x) (/ (- x lo) (- hi lo)))) (lambda (x) (/ (- x lo) (- hi lo))))
@ -76,18 +76,18 @@
(match lsts (match lsts
([ys] (let ((xmin 0) ([ys] (let ((xmin 0)
(xmax (length ys)) (xmax (length ys))
(ymin (for/fold (ymin +nan.0) (y ys) (nanmin ymin y))) (ymin (nanmin ys))
(ymax (for/fold (ymax +nan.0) (y ys) (nanmax ymax y)))) (ymax (nanmax ys)))
(values xmin xmax ymin ymax (values xmin xmax ymin ymax
[(draw-canvas (iota (length ys)) ys [(draw-canvas (iota (length ys)) ys
(scale-fn xmin xmax) (scale-fn xmin xmax)
(scale-fn ymin ymax) (scale-fn ymin ymax)
width: width height: height)]))) width: width height: height)])))
([xs . yss] (let* ((xmin (for/fold (xmin +nan.0) (x xs) (nanmin xmin x))) ([xs . yss] (let* ((xmin (nanmin xs))
(xmax (for/fold (xmax +nan.0) (x xs) (nanmax xmax x))) (xmax (nanmax xs))
(all-ys (flatten yss)) (all-ys (flatten yss))
(ymin (for/fold (ymin +nan.0) (y all-ys) (nanmin ymin y))) (ymin (nanmin all-ys))
(ymax (for/fold (ymax +nan.0) (y all-ys) (nanmax ymax y))) (ymax (nanmax all-ys))
(x-scale-fn (scale-fn xmin xmax)) (x-scale-fn (scale-fn xmin xmax))
(y-scale-fn (scale-fn ymin ymax))) (y-scale-fn (scale-fn ymin ymax)))
(values xmin xmax ymin ymax (values xmin xmax ymin ymax