add next/prev values to ordered-range-value building

put the previous value on the start boundaries and a the next
value on the end boundaries
This commit is contained in:
2026-01-11 16:50:17 -06:00
parent 98a9fd43fe
commit caf5bda249
2 changed files with 38 additions and 30 deletions

View File

@@ -49,10 +49,12 @@
(mapcat (fn [range] (mapcat (fn [range]
[{:value (start range) [{:value (start range)
:boundary-type :start :boundary-type :start
:type (range-type range)} :type (range-type range)
:prev-value (value-before range)}
{:value (end range) {:value (end range)
:boundary-type :end :boundary-type :end
:type (range-type range)}])) :type (range-type range)
:next-value (value-after range)}]))
(sort-by (juxt :value (comp {:start 0 :end 1} :boundary-type))))) (sort-by (juxt :value (comp {:start 0 :end 1} :boundary-type)))))
(defmulti ->discrete-value-range (fn [range-type _start _end] (defmulti ->discrete-value-range (fn [range-type _start _end]

View File

@@ -64,22 +64,22 @@
;; test against integer ranges for easy of expression and interpretation ;; test against integer ranges for easy of expression and interpretation
(deftest ordered-range-values (deftest ordered-range-values
(testing "ordered range values are sorted by value and then the range's start boundary before any end boundary" (testing "ordered range values are sorted by value and then the range's start boundary before any end boundary"
(is (= [{:value 1 :boundary-type :start :type :int-range-inclusive} (is (= [{:value 1 :prev-value 0 :boundary-type :start :type :int-range-inclusive}
{:value 2 :boundary-type :end :type :int-range-inclusive} {:value 2 :next-value 3 :boundary-type :end :type :int-range-inclusive}
{:value 4 :boundary-type :start :type :int-range-inclusive} {:value 4 :prev-value 3 :boundary-type :start :type :int-range-inclusive}
{:value 5 :boundary-type :start :type :int-range-inclusive} {:value 5 :prev-value 4 :boundary-type :start :type :int-range-inclusive}
{:value 5 :boundary-type :start :type :int-range-inclusive} {:value 5 :prev-value 4 :boundary-type :start :type :int-range-inclusive}
{:value 5 :boundary-type :end :type :int-range-inclusive} {:value 5 :next-value 6 :boundary-type :end :type :int-range-inclusive}
{:value 5 :boundary-type :end :type :int-range-inclusive} {:value 5 :next-value 6 :boundary-type :end :type :int-range-inclusive}
{:value 8 :boundary-type :end :type :int-range-inclusive}] {:value 8 :next-value 9 :boundary-type :end :type :int-range-inclusive}]
(#'range/ordered-range-values [(int-range-inclusive 1 2) (#'range/ordered-range-values [(int-range-inclusive 1 2)
(int-range-inclusive 4 5) (int-range-inclusive 4 5)
(int-range-inclusive 5 8) (int-range-inclusive 5 8)
(int-range-inclusive 5 5)]))) (int-range-inclusive 5 5)])))
(is (= [{:value 5 :boundary-type :start :type :int-range-inclusive} (is (= [{:value 5 :prev-value 4 :boundary-type :start :type :int-range-inclusive}
{:value 5 :boundary-type :start :type :int-range-inclusive} {:value 5 :prev-value 4 :boundary-type :start :type :int-range-inclusive}
{:value 5 :boundary-type :end :type :int-range-inclusive} {:value 5 :next-value 6 :boundary-type :end :type :int-range-inclusive}
{:value 5 :boundary-type :end :type :int-range-inclusive}] {:value 5 :next-value 6 :boundary-type :end :type :int-range-inclusive}]
(#'range/ordered-range-values [(int-range-inclusive 5 5) (#'range/ordered-range-values [(int-range-inclusive 5 5)
(int-range-inclusive 5 5)]))))) (int-range-inclusive 5 5)])))))
@@ -136,12 +136,10 @@
:range-source-type :filter-range :range-source-type :filter-range
:value 1 :value 1
:prev-value 0 :prev-value 0
:next-value 2
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :filter-range :range-source-type :filter-range
:value 4 :value 4
:prev-value 3
:next-value 5 :next-value 5
:type :int-range-inclusive}])))) :type :int-range-inclusive}]))))
(testing "only source-ranges" (testing "only source-ranges"
@@ -149,28 +147,34 @@
(range/walk-range-boundaries [{:boundary-type :start (range/walk-range-boundaries [{:boundary-type :start
:range-source-type :source-range :range-source-type :source-range
:value 1 :value 1
:prev-value 0
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :source-range :range-source-type :source-range
:value 5 :value 5
:next-value 6
:type :int-range-inclusive}]))) :type :int-range-inclusive}])))
(is (= #{(int-range-inclusive 1 5) (is (= #{(int-range-inclusive 1 5)
(int-range-inclusive 11 15)} (int-range-inclusive 11 15)}
(range/walk-range-boundaries [{:boundary-type :start (range/walk-range-boundaries [{:boundary-type :start
:range-source-type :source-range :range-source-type :source-range
:value 1 :value 1
:next-value 2
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :source-range :range-source-type :source-range
:value 5 :value 5
:prev-value 4
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :start {:boundary-type :start
:range-source-type :source-range :range-source-type :source-range
:value 11 :value 11
:next-value 12
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :source-range :range-source-type :source-range
:value 15 :value 15
:prev-value 14
:type :int-range-inclusive}])))) :type :int-range-inclusive}]))))
(testing "filter-ranges before source-ranges" (testing "filter-ranges before source-ranges"
(is (= #{(int-range-inclusive 11 15)} (is (= #{(int-range-inclusive 11 15)}
@@ -178,41 +182,41 @@
:range-source-type :filter-range :range-source-type :filter-range
:value 1 :value 1
:prev-value 0 :prev-value 0
:next-value 2
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :filter-range :range-source-type :filter-range
:prev-value 4
:value 5 :value 5
:next-value 6 :next-value 6
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :start {:boundary-type :start
:range-source-type :source-range :range-source-type :source-range
:value 11 :value 11
:prev-value 10
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :source-range :range-source-type :source-range
:value 15 :value 15
:next-value 16
:type :int-range-inclusive}])))) :type :int-range-inclusive}]))))
(testing "filter-ranges after source-ranges" (testing "filter-ranges after source-ranges"
(is (= #{(int-range-inclusive 1 5)} (is (= #{(int-range-inclusive 1 5)}
(range/walk-range-boundaries [{:boundary-type :start (range/walk-range-boundaries [{:boundary-type :start
:range-source-type :source-range :range-source-type :source-range
:value 1 :value 1
:prev-value 0
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :source-range :range-source-type :source-range
:value 5 :value 5
:next-value 6
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :start {:boundary-type :start
:range-source-type :filter-range :range-source-type :filter-range
:prev-value 10 :prev-value 10
:value 11 :value 11
:next-value 12
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :filter-range :range-source-type :filter-range
:prev-value 14
:value 15 :value 15
:next-value 16 :next-value 16
:type :int-range-inclusive}])))) :type :int-range-inclusive}]))))
@@ -222,22 +226,22 @@
(range/walk-range-boundaries [{:boundary-type :start (range/walk-range-boundaries [{:boundary-type :start
:range-source-type :source-range :range-source-type :source-range
:value 1 :value 1
:prev-value 0
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :start {:boundary-type :start
:range-source-type :filter-range :range-source-type :filter-range
:prev-value 5 :prev-value 5
:value 6 :value 6
:next-value 7
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :filter-range :range-source-type :filter-range
:prev-value 10
:value 10 :value 10
:next-value 11 :next-value 11
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :source-range :range-source-type :source-range
:value 20 :value 20
:next-value 21
:type :int-range-inclusive}])))) :type :int-range-inclusive}]))))
(testing "multiple filter-ranges between source-range" (testing "multiple filter-ranges between source-range"
(is (= #{(int-range-inclusive 1 5) (is (= #{(int-range-inclusive 1 5)
@@ -246,16 +250,15 @@
(range/walk-range-boundaries [{:boundary-type :start (range/walk-range-boundaries [{:boundary-type :start
:range-source-type :source-range :range-source-type :source-range
:value 1 :value 1
:prev-value 0
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :start {:boundary-type :start
:range-source-type :filter-range :range-source-type :filter-range
:prev-value 5 :prev-value 5
:value 6 :value 6
:next-value 7
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :filter-range :range-source-type :filter-range
:prev-value 10
:value 10 :value 10
:next-value 11 :next-value 11
:type :int-range-inclusive} :type :int-range-inclusive}
@@ -263,17 +266,16 @@
:range-source-type :filter-range :range-source-type :filter-range
:prev-value 12 :prev-value 12
:value 13 :value 13
:next-value 14
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :filter-range :range-source-type :filter-range
:prev-value 18
:value 19 :value 19
:next-value 20 :next-value 20
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :source-range :range-source-type :source-range
:value 20 :value 20
:prev-value 19
:type :int-range-inclusive}])))) :type :int-range-inclusive}]))))
(testing "source range between filter-range" (testing "source range between filter-range"
(is (= #{} (is (= #{}
@@ -281,27 +283,29 @@
:range-source-type :filter-range :range-source-type :filter-range
:prev-value 1 :prev-value 1
:value 1 :value 1
:next-value 2
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :start {:boundary-type :start
:range-source-type :source-range :range-source-type :source-range
:value 6 :value 6
:prev-value 5
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :source-range :range-source-type :source-range
:value 10 :value 10
:next-value 11
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :start {:boundary-type :start
:range-source-type :source-range :range-source-type :source-range
:value 13 :value 13
:prev-value 12
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :source-range :range-source-type :source-range
:value 19 :value 19
:next-value 20
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :filter-range :range-source-type :filter-range
:prev-value 19
:value 20 :value 20
:next-value 21 :next-value 21
:type :int-range-inclusive}])))) :type :int-range-inclusive}]))))
@@ -311,29 +315,31 @@
(range/walk-range-boundaries [{:boundary-type :start (range/walk-range-boundaries [{:boundary-type :start
:range-source-type :source-range :range-source-type :source-range
:value 1 :value 1
:prev-value 0
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :start {:boundary-type :start
:range-source-type :filter-range :range-source-type :filter-range
:prev-value 4 :prev-value 4
:value 5 :value 5
:next-value 6
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :source-range :range-source-type :source-range
:value 6 :value 6
:next-value 7
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :start {:boundary-type :start
:range-source-type :source-range :range-source-type :source-range
:value 8 :value 8
:prev-value 7
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :filter-range :range-source-type :filter-range
:prev-value 9
:value 10 :value 10
:next-value 11 :next-value 11
:type :int-range-inclusive} :type :int-range-inclusive}
{:boundary-type :end {:boundary-type :end
:range-source-type :source-range :range-source-type :source-range
:value 13 :value 13
:next-value 14
:type :int-range-inclusive}]))))) :type :int-range-inclusive}])))))