···
7
+
#[derive(Copy, Clone, PartialEq, Debug)]
15
+
#[derive(Clone, Debug)]
23
+
#[derive(Clone, Debug)]
// Wrap Rc in a single-value enum so I can implement traits for it.
29
+
#[derive(Clone, Debug)]
children: (DnaRef, DnaRef),
36
+
#[derive(Clone, Debug)]
children: (DnaRef, DnaRef, DnaRef),
44
+
fn from_char(c: char) -> Option<Base> {
46
+
'I' => Some(Base::I),
47
+
'C' => Some(Base::C),
48
+
'F' => Some(Base::F),
49
+
'P' => Some(Base::P),
54
+
fn to_char(&self) -> char {
Self::DnaRef(Rc::new(Dna::Empty))
40
-
fn from_char(c: char) -> Self {
41
-
Self::DnaRef(Rc::new(Dna::Leaf(c)))
69
+
fn from_base(b: Base) -> Self {
70
+
Self::DnaRef(Rc::new(Dna::Leaf(b)))
fn from_two_children(a: DnaRef, b: DnaRef) -> Self {
···
pub fn from_string(s: &str) -> Self {
64
-
s.chars().map(|c| DnaRef::from_char(c)).collect::<DnaRef>()
94
+
.filter_map(|c| Base::from_char(c))
95
+
.map(|b| DnaRef::from_base(b))
96
+
.collect::<DnaRef>()
pub fn len(&self) -> usize {
···
debug_assert!(n <= self.len());
Dna::Empty => (DnaRef::new(), DnaRef::new()),
97
-
(DnaRef::new(), DnaRef::from_char(*c))
129
+
(DnaRef::new(), DnaRef::from_base(*b))
99
-
(DnaRef::from_char(*c), DnaRef::new())
131
+
(DnaRef::from_base(*b), DnaRef::new())
···
166
+
pub fn to_string(&self) -> String {
167
+
self.iter().map(|b| Base::to_char(&b)).collect::<String>()
···
cur = DnaRefIter::new(cur.into_iter()).collect();
205
-
return cur.pop().unwrap();
243
+
None => DnaRef::new(),
···
impl<'a> Iterator for DnaIterator<'a> {
fn next(&mut self) -> Option<Self::Item> {
while let Some(node) = self.stack.pop() {
···
} else if lhs.depth() < rhs.depth() {
Dna::Empty => unreachable!(),
250
-
Dna::Leaf(_) => unreachable!(),
289
+
Dna::Leaf(_) => AddState::One(rhs),
let (a, b) = &node.children;
match add_helper(lhs, a.clone()) {
···
Dna::Empty => unreachable!(),
276
-
Dna::Leaf(_) => unreachable!(),
315
+
Dna::Leaf(_) => AddState::One(lhs.clone()),
let (a, b) = &node.children;
match add_helper(b.clone(), rhs) {
···
impl Index<usize> for DnaRef {
314
-
type Output = char;
353
+
type Output = Base;
fn index(&self, n: usize) -> &Self::Output {
debug_assert!(n < self.len());
···
fn test_to_from_string() {
let dna: DnaRef = DnaRef::from_string("ICFP");
357
-
assert_eq!(dna.iter().collect::<String>(), "ICFP");
396
+
assert_eq!(dna.to_string(), "ICFP");
let dna: DnaRef = DnaRef::from_string(s);
364
-
for (i, c) in s.chars().enumerate() {
365
-
assert_eq!(dna[i], c);
403
+
assert_eq!(dna[0], Base::I);
404
+
assert_eq!(dna[1], Base::C);
405
+
assert_eq!(dna[2], Base::F);
406
+
assert_eq!(dna[3], Base::P);
371
-
let lhs = DnaRef::from_string("ABCD");
372
-
let rhs = DnaRef::from_string("WXYZ");
373
-
assert_eq!((lhs + rhs).iter().collect::<String>(), "ABCDWXYZ");
411
+
let lhs = DnaRef::from_string("IIIC");
412
+
let rhs = DnaRef::from_string("PFFF");
413
+
assert_eq!((lhs + rhs).to_string(), "IIICPFFF");
378
-
let dna = DnaRef::from_string("ABCDWXYZ");
418
+
let dna = DnaRef::from_string("IIICPFFF");
let (lhs, rhs) = dna.split(4);
380
-
assert_eq!(lhs.iter().collect::<String>(), "ABCD");
381
-
assert_eq!(rhs.iter().collect::<String>(), "WXYZ");
420
+
assert_eq!(lhs.to_string(), "IIIC");
421
+
assert_eq!(rhs.to_string(), "PFFF");