@@ -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