Support NaN values

This commit is contained in:
Dimitri Lozeve 2021-04-30 23:08:44 +02:00
parent 4ff1f01e5c
commit 5c8e3c9234

View file

@ -12,12 +12,18 @@
(def +default-colors+ '(green blue red yellow cyan magenta white))
(def (nanmin . rest)
(apply min (filter finite? rest)))
(def (nanmax . rest)
(apply max (filter finite? rest)))
(def (scale-fn lo hi)
(lambda (x) (/ (- x lo) (- hi lo))))
(def (draw-canvas xs ys x-scale-fn y-scale-fn width: (width 160) height: (height 80))
(def canvas (make-braille-canvas (1+ height) (1+ width)))
(for ((x xs) (y ys))
(for ((x xs) (y ys) when (and (finite? x) (finite? y)))
(braille-canvas-set! canvas
(inexact->exact (floor (* height (y-scale-fn y))))
(inexact->exact (floor (* width (x-scale-fn x))))
@ -65,27 +71,27 @@
(match lsts
([ys] (let ((xmin 0)
(xmax (length ys))
(ymin (apply min ys))
(ymax (apply max ys)))
(ymin (apply nanmin ys))
(ymax (apply nanmax ys)))
(values xmin xmax ymin ymax
[(draw-canvas (iota (length ys)) ys
(scale-fn xmin xmax)
(scale-fn ymin ymax)
width: width height: height)])))
([xs ys] (let ((xmin (apply min xs))
(xmax (apply max xs))
(ymin (apply min ys))
(ymax (apply max ys)))
([xs ys] (let ((xmin (apply nanmin xs))
(xmax (apply nanmax xs))
(ymin (apply nanmin ys))
(ymax (apply nanmax ys)))
(values xmin xmax ymin ymax
[(draw-canvas xs ys
(scale-fn xmin xmax)
(scale-fn ymin ymax)
width: width height: height)])))
([xs . yss] (let* ((xmin (apply min xs))
(xmax (apply max xs))
([xs . yss] (let* ((xmin (apply nanmin xs))
(xmax (apply nanmax xs))
(all-ys (flatten yss))
(ymin (apply min all-ys))
(ymax (apply max all-ys))
(ymin (apply nanmin all-ys))
(ymax (apply nanmax all-ys))
(x-scale-fn (scale-fn xmin xmax))
(y-scale-fn (scale-fn ymin ymax)))
(values xmin xmax ymin ymax