···
// Wrap Rc in a single-value enum so I can implement traits for it.
children: (DnaRef, DnaRef),
children: (DnaRef, DnaRef, DnaRef),
Self::DnaRef(Rc::new(Dna::Empty))
-
fn from_char(c: char) -> Self {
-
Self::DnaRef(Rc::new(Dna::Leaf(c)))
fn from_two_children(a: DnaRef, b: DnaRef) -> Self {
···
pub fn from_string(s: &str) -> Self {
-
s.chars().map(|c| DnaRef::from_char(c)).collect::<DnaRef>()
pub fn len(&self) -> usize {
···
debug_assert!(n <= self.len());
Dna::Empty => (DnaRef::new(), DnaRef::new()),
-
(DnaRef::new(), DnaRef::from_char(*c))
-
(DnaRef::from_char(*c), DnaRef::new())
···
···
cur = DnaRefIter::new(cur.into_iter()).collect();
-
return cur.pop().unwrap();
···
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!(),
-
Dna::Leaf(_) => unreachable!(),
let (a, b) = &node.children;
match add_helper(lhs, a.clone()) {
···
Dna::Empty => unreachable!(),
-
Dna::Leaf(_) => unreachable!(),
let (a, b) = &node.children;
match add_helper(b.clone(), rhs) {
···
impl Index<usize> for DnaRef {
fn index(&self, n: usize) -> &Self::Output {
debug_assert!(n < self.len());
···
fn test_to_from_string() {
let dna: DnaRef = DnaRef::from_string("ICFP");
-
assert_eq!(dna.iter().collect::<String>(), "ICFP");
let dna: DnaRef = DnaRef::from_string(s);
-
for (i, c) in s.chars().enumerate() {
-
let lhs = DnaRef::from_string("ABCD");
-
let rhs = DnaRef::from_string("WXYZ");
-
assert_eq!((lhs + rhs).iter().collect::<String>(), "ABCDWXYZ");
-
let dna = DnaRef::from_string("ABCDWXYZ");
let (lhs, rhs) = dna.split(4);
-
assert_eq!(lhs.iter().collect::<String>(), "ABCD");
-
assert_eq!(rhs.iter().collect::<String>(), "WXYZ");
···
+
#[derive(Copy, Clone, PartialEq, Debug)]
+
#[derive(Clone, Debug)]
+
#[derive(Clone, Debug)]
// Wrap Rc in a single-value enum so I can implement traits for it.
+
#[derive(Clone, Debug)]
children: (DnaRef, DnaRef),
+
#[derive(Clone, Debug)]
children: (DnaRef, DnaRef, DnaRef),
+
fn from_char(c: char) -> Option<Base> {
+
fn to_char(&self) -> char {
Self::DnaRef(Rc::new(Dna::Empty))
+
fn from_base(b: Base) -> Self {
+
Self::DnaRef(Rc::new(Dna::Leaf(b)))
fn from_two_children(a: DnaRef, b: DnaRef) -> Self {
···
pub fn from_string(s: &str) -> Self {
+
.filter_map(|c| Base::from_char(c))
+
.map(|b| DnaRef::from_base(b))
pub fn len(&self) -> usize {
···
debug_assert!(n <= self.len());
Dna::Empty => (DnaRef::new(), DnaRef::new()),
+
(DnaRef::new(), DnaRef::from_base(*b))
+
(DnaRef::from_base(*b), DnaRef::new())
···
+
pub fn to_string(&self) -> String {
+
self.iter().map(|b| Base::to_char(&b)).collect::<String>()
···
cur = DnaRefIter::new(cur.into_iter()).collect();
···
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!(),
+
Dna::Leaf(_) => AddState::One(rhs),
let (a, b) = &node.children;
match add_helper(lhs, a.clone()) {
···
Dna::Empty => unreachable!(),
+
Dna::Leaf(_) => AddState::One(lhs.clone()),
let (a, b) = &node.children;
match add_helper(b.clone(), rhs) {
···
impl Index<usize> for DnaRef {
fn index(&self, n: usize) -> &Self::Output {
debug_assert!(n < self.len());
···
fn test_to_from_string() {
let dna: DnaRef = DnaRef::from_string("ICFP");
+
assert_eq!(dna.to_string(), "ICFP");
let dna: DnaRef = DnaRef::from_string(s);
+
assert_eq!(dna[0], Base::I);
+
assert_eq!(dna[1], Base::C);
+
assert_eq!(dna[2], Base::F);
+
assert_eq!(dna[3], Base::P);
+
let lhs = DnaRef::from_string("IIIC");
+
let rhs = DnaRef::from_string("PFFF");
+
assert_eq!((lhs + rhs).to_string(), "IIICPFFF");
+
let dna = DnaRef::from_string("IIICPFFF");
let (lhs, rhs) = dna.split(4);
+
assert_eq!(lhs.to_string(), "IIIC");
+
assert_eq!(rhs.to_string(), "PFFF");