@@ -179,6 +179,19 @@ impl<T: Serialize + DeserializeOwned> Deque<T> {
179179            . map ( Some ) 
180180    } 
181181
182+     /// Sets the value at the given position in the queue. Returns [`StdError::NotFound`] if index is out of bounds 
183+      pub  fn  set ( & self ,  storage :  & mut  dyn  Storage ,  pos :  u32 ,  value :  & T )  -> StdResult < ( ) >  { 
184+         let  head = self . head ( storage) ?; 
185+         let  tail = self . tail ( storage) ?; 
186+ 
187+         if  pos >= calc_len ( head,  tail)  { 
188+             // out of bounds 
189+             return  Err ( StdError :: not_found ( format ! ( "deque position {}" ,  pos) ) ) ; 
190+         } 
191+ 
192+         self . set_unchecked ( storage,  pos,  value) 
193+     } 
194+ 
182195    /// Tries to get the value at the given position 
183196     /// Used internally 
184197     fn  get_unchecked ( & self ,  storage :  & dyn  Storage ,  pos :  u32 )  -> StdResult < Option < T > >  { 
@@ -676,4 +689,35 @@ mod tests {
676689            "out of bounds access should return None" 
677690        ) ; 
678691    } 
692+ 
693+     #[ test]  
694+     fn  set ( )  { 
695+         let  mut  store = MockStorage :: new ( ) ; 
696+         let  deque = Deque :: new ( "test" ) ; 
697+ 
698+         deque. push_back ( & mut  store,  & 1u32 ) . unwrap ( ) ; 
699+         deque. push_back ( & mut  store,  & 2 ) . unwrap ( ) ; 
700+ 
701+         deque. set ( & mut  store,  1 ,  & 3 ) . unwrap ( ) ; 
702+ 
703+         assert_eq ! ( deque. get( & store,  1 ) . unwrap( ) ,  Some ( 3 ) ) ; 
704+         assert_eq ! ( deque. back( & store) . unwrap( ) ,  Some ( 3 ) ) ; 
705+         assert_eq ! ( 
706+             deque. get( & store,  2 ) . unwrap( ) , 
707+             None , 
708+             "out of bounds access should return None" 
709+         ) ; 
710+ 
711+         assert ! ( 
712+             matches!( deque. set( & mut  store,  2 ,  & 3 ) ,  Err ( StdError :: NotFound  {  .. } ) ) , 
713+             "setting value at an out of bounds index should error" 
714+         ) ; 
715+ 
716+         assert_eq ! ( deque. pop_back( & mut  store) ,  Ok ( Some ( 3 ) ) ) ; 
717+ 
718+         assert ! ( 
719+             matches!( deque. set( & mut  store,  1 ,  & 3 ) ,  Err ( StdError :: NotFound  {  .. } ) ) , 
720+             "setting value at an out of bounds index should error" 
721+         ) ; 
722+     } 
679723} 
0 commit comments