Skip to content

Commit 176ccbd

Browse files
now we plug it in?
1 parent d42aa53 commit 176ccbd

1 file changed

Lines changed: 52 additions & 16 deletions

File tree

src/linked_array/mod.rs

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,32 +43,68 @@ impl LinkedArray<u32> {
4343
}
4444
}
4545

46-
fn get(&self) -> Vec<u32> {
47-
vec![0]
48-
}
49-
46+
// morally, I can just act conditionally, and do nothing otherwise,
47+
// but then what if my callee, wants to do something conditionally on my actions?
48+
// in that case I am truly and fully fucked.
5049
fn replace_pair(&mut self, idx: usize, token_id: u32) -> Result<(), MergeError> {
5150
if idx >= self.vec.len() {
5251
return Err(MergeError::InvalidIndex)
5352
}
5453

55-
let left_ref = self.vec[idx].as_ref();
56-
54+
// get data without holding borrows
55+
let (fst_elem, snd_idx, snd_elem, snd_next_idx_opt) = {
56+
let fst = self.vec[idx].as_ref().ok_or(MergeError::ElementNotFound)?;
57+
let snd_idx = fst.next.ok_or(MergeError::NextElementNotFound)?;
58+
let snd = self.vec[snd_idx].as_ref().ok_or(MergeError::NextElementNotFound)?;
59+
60+
(fst.elem, snd_idx, snd.elem, snd.next)
61+
};
62+
63+
// get new token id
64+
let fst_bytes = self.interner.get_bytes(fst_elem);
65+
let snd_bytes = self.interner.get_bytes(snd_elem);
66+
67+
let mut merged_bytes = Vec::with_capacity(fst_bytes.len() + snd_bytes.len());
68+
69+
merged_bytes.extend_from_slice(fst_bytes);
70+
merged_bytes.extend_from_slice(snd_bytes);
71+
72+
let new_token_id = self.interner.intern(merged_bytes);
73+
74+
// mutate first element.
75+
if let Some(fst) = self.vec[idx].as_mut() {
76+
fst.elem = new_token_id;
77+
fst.next = snd_next_idx_opt; // Skip over the second element
78+
}
79+
80+
// if snd_next exists, update its prev pointer.
81+
if let Some(snd_next_idx) = snd_next_idx_opt {
82+
if let Some(snd_next_node) = self.vec[snd_next_idx].as_mut() {
83+
snd_next_node.prev = Some(idx);
84+
}
85+
}
86+
87+
// remove snd.
88+
self.vec[snd_idx] = None;
89+
5790
Ok(())
5891
}
5992

60-
fn prev(&self, idx: usize,) -> Option<&LinkedArrayNode<u32>> {
61-
// let node = self.vec.get(idx)?;
62-
// let prev_idx = node.prev?;
63-
// self.vec.get(prev_idx)
64-
//
65-
None
93+
fn prev(&self, idx: usize) -> Option<&LinkedArrayNode<u32>> {
94+
// Monadic bind style - chain the operations
95+
self.vec.get(idx)
96+
.and_then(|node| node.as_ref())
97+
.and_then(|node| node.prev)
98+
.and_then(|prev_idx| self.vec.get(prev_idx))
99+
.and_then(|node| node.as_ref())
66100
}
67101

68102
fn next(&self, idx: usize) -> Option<&LinkedArrayNode<u32>> {
69-
// let node = self.vec.get(idx)?;
70-
// let prev_idx = node.next?;
71-
// self.vec.get(prev_idx)
72-
None
103+
// Monadic bind style - chain the operations
104+
self.vec.get(idx)
105+
.and_then(|node| node.as_ref())
106+
.and_then(|node| node.next)
107+
.and_then(|next_idx| self.vec.get(next_idx))
108+
.and_then(|node| node.as_ref())
73109
}
74110
}

0 commit comments

Comments
 (0)