1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use crate::Matrix;

use super::det::Det;
use super::submatrix::Submatrix;

pub trait Minor: Matrix
{
    type Index;
    type Output;

    /// Returns the determinant of the submatrix of a given cell
    /// 
    /// |Mᵢⱼ|
    /// 
    /// # Arguments
    /// 
    /// * `index` - Row and/or collumn to neglect
    /// 
    /// # Examples
    /// 
    /// ```rust
    /// let a = [
    ///     [1.0, 2.0, 3.0],
    ///     [4.0, 5.0, 6.0],
    ///     [7.0, 8.0, 9.0]
    /// ];
    /// let m = [
    ///     [5.0, 6.0],
    ///     [8.0, 9.0]
    /// ].det();
    /// assert_eq!(a.minor((0, 0)), m);
    /// ```
    fn minor(&self, index: Self::Index) -> Self::Output;
}

impl<F, const N: usize> Minor for [[F; N]; N]
where
    Self: Submatrix<[[F; N - 1]; N - 1], Index = (usize, usize)>,
    [[F; N - 1]; N - 1]: Det
{
    type Index = <Self as Submatrix<[[F; N - 1]; N - 1]>>::Index;
    type Output = <[[F; N - 1]; N - 1] as Det>::Output;
    fn minor(&self, index: Self::Index) -> Self::Output
    {
        self.submatrix(index).det()
    }
}

/*impl<F, const N: usize> Minor for [[F; N - 1]; N]
where
    Self: Submatrix<[[F; N - 1]; N - 1], Index = usize>,
    [[F; N - 1]; N - 1]: Det
{
    type Index = <Self as Submatrix<[[F; N - 1]; N - 1]>>::Index;
    type Output = <[[F; N - 1]; N - 1] as Det>::Output;
    fn minor(&self, index: Self::Index) -> Self::Output
    {
        self.submatrix(index).det()
    }
}

impl<F, const N: usize> Minor for [[F; N]; N - 1]
where
    Self: Submatrix<[[F; N - 1]; N - 1], Index = usize>,
    [[F; N - 1]; N - 1]: Det
{
    type Index = <Self as Submatrix<[[F; N - 1]; N - 1]>>::Index;
    type Output = <[[F; N - 1]; N - 1] as Det>::Output;
    fn minor(&self, index: Self::Index) -> Self::Output
    {
        self.submatrix(index).det()
    }
}*/