1
2use crate::imp_prelude::*;
3
4pub(crate) trait SplitAt {
6 fn split_at(self, axis: Axis, index: usize) -> (Self, Self) where Self: Sized;
7}
8
9pub(crate) trait SplitPreference : SplitAt {
10 fn can_split(&self) -> bool;
11 fn split_preference(&self) -> (Axis, usize);
12 fn split(self) -> (Self, Self) where Self: Sized {
13 let (axis, index) = self.split_preference();
14 self.split_at(axis, index)
15 }
16}
17
18impl<D> SplitAt for D
19where
20 D: Dimension,
21{
22 fn split_at(self, axis: Axis, index: Ix) -> (Self, Self) {
23 let mut d1 = self;
24 let mut d2 = d1.clone();
25 let i = axis.index();
26 let len = d1[i];
27 d1[i] = index;
28 d2[i] = len - index;
29 (d1, d2)
30 }
31}
32
33impl<'a, A, D> SplitAt for ArrayViewMut<'a, A, D>
34 where D: Dimension
35{
36 fn split_at(self, axis: Axis, index: usize) -> (Self, Self) {
37 self.split_at(axis, index)
38 }
39}
40
41
42impl<A, D> SplitAt for RawArrayViewMut<A, D>
43 where D: Dimension
44{
45 fn split_at(self, axis: Axis, index: usize) -> (Self, Self) {
46 self.split_at(axis, index)
47 }
48}