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 74 75 76
/// # Selector trait
/// Selectors are the way to get the current state and transform it into something useful for our app.
/// You can write a selector by implementing the `Selector` trait or by writing a function with the signature `Fn(&State) -> Result`
///
/// ## Trait example
/// ```
/// use redux_rs::Selector;
///
/// enum State {
/// Authorized { bearer_token: String },
/// Unauthorized
/// }
///
/// struct BearerTokenSelector;
/// impl Selector<State> for BearerTokenSelector {
/// type Result = Option<String>;
///
/// fn select(&self, state: &State) -> Self::Result {
/// match state {
/// State::Authorized { bearer_token } => Some(bearer_token.clone()),
/// State::Unauthorized => None
/// }
/// }
/// }
///
/// let selector = BearerTokenSelector;
/// let state = State::Authorized { bearer_token: "secret".to_string() };
/// assert_eq!(selector.select(&state), Some("secret".to_string()));
/// ```
///
/// ## Fn example
/// ```
/// use redux_rs::Selector;
///
/// enum State {
/// Authorized { bearer_token: String },
/// Unauthorized
/// }
///
/// struct BearerTokenSelector;
/// impl Selector<State> for BearerTokenSelector {
/// type Result = Option<String>;
///
/// fn select(&self, state: &State) -> Self::Result {
/// match state {
/// State::Authorized { bearer_token } => Some(bearer_token.clone()),
/// State::Unauthorized => None
/// }
/// }
/// }
///
/// let selector = |state: &State| {
/// match state {
/// State::Authorized { bearer_token } => Some(bearer_token.clone()),
/// State::Unauthorized => None
/// }
/// };
/// let state = State::Authorized { bearer_token: "secret".to_string() };
/// assert_eq!(selector.select(&state), Some("secret".to_string()));
/// ```
pub trait Selector<State> {
type Result;
fn select(&self, state: &State) -> Self::Result;
}
impl<F, State, Result> Selector<State> for F
where
F: Fn(&State) -> Result,
{
type Result = Result;
fn select(&self, state: &State) -> Self::Result {
self(state)
}
}