Skip to content

Commit 5c85f08

Browse files
committed
add into_value
1 parent f48a85b commit 5c85f08

File tree

5 files changed

+40
-1
lines changed

5 files changed

+40
-1
lines changed

src/refined.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ where
7171
mod test {
7272
use crate::refined::Refined;
7373
use crate::result::Error;
74-
use crate::rule::NonEmptyStringRule;
74+
use crate::rule::{ClosedAlgebraic, NonEmptyStringRule};
7575

7676
#[test]
7777
fn test_refined_non_empty_string_ok() -> Result<(), Error<String>> {
@@ -93,4 +93,14 @@ mod test {
9393
assert_eq!(format!("{}", non_empty_string), "Hello");
9494
Ok(())
9595
}
96+
97+
#[test]
98+
fn test_refined_plus_non_empty_string() -> Result<(), Error<String>> {
99+
let non_empty_string_1 = Refined::<NonEmptyStringRule>::new("Hello".to_string())?;
100+
let non_empty_string_2 = Refined::<NonEmptyStringRule>::new("World".to_string())?;
101+
let nonempty_string = non_empty_string_1.plus(non_empty_string_2);
102+
103+
assert_eq!(nonempty_string.into_value(), "HelloWorld");
104+
Ok(())
105+
}
96106
}

src/rule.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
mod closed_algebraic;
12
pub mod composer;
23
mod empty;
34
mod non_empty;
45
mod string;
56

67
use crate::result::Error;
8+
pub use closed_algebraic::ClosedAlgebraic;
79
pub use empty::*;
810
pub use non_empty::*;
911
pub use string::*;

src/rule/closed_algebraic.rs

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub trait ClosedAlgebraic {
2+
fn plus(self, that: Self) -> Self;
3+
}

src/rule/non_empty/non_empty_string.rs

+9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
use crate::refined::Refined;
2+
use crate::rule::closed_algebraic::ClosedAlgebraic;
23
use crate::rule::NonEmpty;
34

45
/// This is a predicate type representing a non-empty string
56
pub type NonEmptyString = Refined<NonEmptyStringRule>;
67

78
pub type NonEmptyStringRule = NonEmpty<String>;
89

10+
/// # Math Theory
11+
/// NonEmpty + NonEmpty = NonEmpty
12+
impl ClosedAlgebraic for NonEmptyString {
13+
fn plus(self, that: NonEmptyString) -> NonEmptyString {
14+
Refined::new(format!("{}{}", self.into_value(), that.into_value())).unwrap()
15+
}
16+
}
17+
918
#[cfg(test)]
1019
mod test {
1120
use crate::rule::{NonEmptyStringRule, Rule};

src/rule/non_empty/non_empty_vec.rs

+15
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,24 @@
1+
use crate::rule::closed_algebraic::ClosedAlgebraic;
12
use crate::rule::NonEmpty;
23
use crate::Refined;
4+
use std::fmt::Debug;
35

46
pub type NonEmptyVec<T> = Refined<NonEmptyVecRule<T>>;
57
pub type NonEmptyVecRule<T> = NonEmpty<Vec<T>>;
68

9+
/// # Math Theory
10+
/// NonEmptyVec + NonEmptyVec = NonEmptyVec
11+
impl<T> ClosedAlgebraic for NonEmptyVec<T>
12+
where
13+
T: Debug,
14+
{
15+
fn plus(self, that: NonEmptyVec<T>) -> NonEmptyVec<T> {
16+
let mut result = self.into_value();
17+
result.append(&mut that.into_value());
18+
Refined::new(result).unwrap()
19+
}
20+
}
21+
722
#[cfg(test)]
823
mod test {
924
use crate::rule::non_empty::NonEmptyVecRule;

0 commit comments

Comments
 (0)