@@ -17,6 +17,7 @@ module mir.series;
1717
1818public import mir.ndslice.slice;
1919public import mir.ndslice.sorting: sort;
20+ import mir.ndslice.sorting: transitionIndex;
2021import mir.qualifier;
2122import std.traits ;
2223
@@ -222,8 +223,6 @@ $(LREF sort) can be used to normalise a series.
222223+/
223224struct mir_series (IndexIterator_, Iterator_, size_t N_ = 1 , SliceKind kind_ = Contiguous)
224225{
225- import std.range : SearchPolicy, assumeSorted;
226-
227226 private enum doUnittest = is (typeof (this ) == Series! (int * , double * ));
228227
229228 // /
@@ -513,14 +512,12 @@ struct mir_series(IndexIterator_, Iterator_, size_t N_ = 1, SliceKind kind_ = Co
513512 +/
514513 auto lowerBound (Index)(Index moment)
515514 {
516- import mir.ndslice.sorting: transitionIndex;
517515 return this [0 .. index.transitionIndex(moment)];
518516 }
519517
520518 // / ditto
521519 auto lowerBound (Index)(Index moment) const
522520 {
523- import mir.ndslice.sorting: transitionIndex;
524521 return this [0 .. index.transitionIndex(moment)];
525522 }
526523
@@ -530,16 +527,14 @@ struct mir_series(IndexIterator_, Iterator_, size_t N_ = 1, SliceKind kind_ = Co
530527 `t > moment` is true for all `t`.
531528 The search schedule and its complexity are documented in `std.range.SearchPolicy`.
532529 +/
533- auto upperBound (SearchPolicy sp = SearchPolicy.binarySearch, Index)(Index moment)
530+ auto upperBound (Index)(Index moment)
534531 {
535- import mir.ndslice.sorting: transitionIndex;
536532 return this [index.transitionIndex! " a <= b" (moment) .. $];
537533 }
538534
539535 // / ditto
540- auto upperBound (SearchPolicy sp = SearchPolicy.binarySearch, Index)(Index moment) const
536+ auto upperBound (Index)(Index moment) const
541537 {
542- import mir.ndslice.sorting: transitionIndex;
543538 return this [index.transitionIndex! " a <= b" (moment) .. $];
544539 }
545540
@@ -554,7 +549,7 @@ struct mir_series(IndexIterator_, Iterator_, size_t N_ = 1, SliceKind kind_ = Co
554549 ref get (Index, Value)(Index moment, return ref Value _default)
555550 if (! is (Value : const (Exception )))
556551 {
557- size_t idx = index.assumeSorted.lowerBound (moment).length ;
552+ size_t idx = index.transitionIndex (moment);
558553 return idx < _data._lengths[0 ] && index[idx] == moment ? data[idx] : _default;
559554 }
560555
@@ -575,7 +570,7 @@ struct mir_series(IndexIterator_, Iterator_, size_t N_ = 1, SliceKind kind_ = Co
575570 auto get (Index, Value)(Index moment, Value _default)
576571 if (! is (Value : const (Exception )))
577572 {
578- size_t idx = index.assumeSorted.lowerBound (moment).length ;
573+ size_t idx = index.transitionIndex (moment);
579574 return idx < _data._lengths[0 ] && index[idx] == moment ? data[idx] : _default;
580575 }
581576
@@ -613,7 +608,7 @@ struct mir_series(IndexIterator_, Iterator_, size_t N_ = 1, SliceKind kind_ = Co
613608 // / ditto
614609 auto ref get (Index)(Index moment, lazy const Exception exc)
615610 {
616- size_t idx = index.assumeSorted.lowerBound (moment).length ;
611+ size_t idx = index.transitionIndex (moment);
617612 if (idx < _data._lengths[0 ] && index[idx] == moment)
618613 {
619614 return data[idx];
@@ -703,14 +698,14 @@ struct mir_series(IndexIterator_, Iterator_, size_t N_ = 1, SliceKind kind_ = Co
703698 // /
704699 bool contains (Index)(Index moment) const
705700 {
706- size_t idx = index.assumeSorted.lowerBound (moment).length ;
701+ size_t idx = index.transitionIndex (moment);
707702 return idx < _data._lengths[0 ] && index[idx] == moment;
708703 }
709704
710705 // /
711706 auto opBinaryRight (string op : " in" , Index)(Index moment)
712707 {
713- size_t idx = index.assumeSorted.lowerBound (moment).length ;
708+ size_t idx = index.transitionIndex (moment);
714709 bool cond = idx < _data._lengths[0 ] && index[idx] == moment;
715710 static if (__traits(compiles, &_data[size_t .init]))
716711 {
@@ -739,7 +734,7 @@ struct mir_series(IndexIterator_, Iterator_, size_t N_ = 1, SliceKind kind_ = Co
739734 // /
740735 bool tryGet (Index, Value)(Index moment, ref Value val)
741736 {
742- size_t idx = index.assumeSorted.lowerBound (moment).length ;
737+ size_t idx = index.transitionIndex (moment);
743738 auto cond = idx < _data._lengths[0 ] && index[idx] == moment;
744739 if (cond)
745740 val = data[idx];
@@ -1434,9 +1429,7 @@ Returns:
14341429+/
14351430size_t findIndex (IndexIterator, Iterator, size_t N, SliceKind kind, Index)(Series! (IndexIterator, Iterator, N, kind) series, Index moment)
14361431{
1437- import std.range : assumeSorted;
1438-
1439- auto idx = series.index.assumeSorted.lowerBound(moment).length;
1432+ auto idx = series.index.transitionIndex(moment);
14401433 if (idx < series._data._lengths[0 ] && series.index[idx] == moment)
14411434 {
14421435 return idx;
@@ -1466,9 +1459,7 @@ Returns:
14661459+/
14671460size_t find (IndexIterator, Iterator, size_t N, SliceKind kind, Index)(Series! (IndexIterator, Iterator, N, kind) series, Index moment)
14681461{
1469- import std.range : assumeSorted;
1470-
1471- auto idx = series.index.assumeSorted.lowerBound(moment).length;
1462+ auto idx = series.index.transitionIndex(moment);
14721463 auto bidx = series._data._lengths[0 ] - idx;
14731464 if (bidx && series.index[idx] == moment)
14741465 {
0 commit comments