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
/*******************************************************************************
 * Copyright (c) 2017 Association Cénotélie (cenotelie.fr)
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General
 * Public License along with this program.
 * If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/

//! Module for utility APIs

pub mod biglist;
pub mod bin;
pub mod iterable;

/// Represents a reference to a structure that can be either mutable or immutable
pub enum EitherMut<'a, T: 'a> {
    /// The immutable reference
    Immutable(&'a T),
    /// The mutable reference
    Mutable(&'a mut T)
}

impl<'a, T: 'a> EitherMut<'a, T> {
    /// Gets a mutable reference
    pub fn get_mut(&mut self) -> Option<&mut T> {
        match self {
            &mut EitherMut::Mutable(ref mut data) => Some(data),
            &mut EitherMut::Immutable(ref _data) => None
        }
    }

    /// Get an immutable reference
    pub fn get(&self) -> &T {
        match self {
            &EitherMut::Mutable(ref data) => data,
            &EitherMut::Immutable(ref data) => data
        }
    }
}