module jyunth_addr::VectorOne {
    use std::vector;
    use std::debug::print;
    use std::string::utf8;
  
    fun vector_basics(): vector<u64> {
        let list = vector::empty<u64>();
  
        vector::push_back(&mut list, 10);
        vector::push_back(&mut list, 20);
  
        vector::insert(&mut list, 2, 30);
        vector::insert(&mut list, 3, 50);
        vector::insert(&mut list, 4, 40);
  
        vector::swap(&mut list, 1, 0);
  
        let value = *vector::borrow(&mut list, 2);
        value = value + 10;
        vector::insert(&mut list, 2, value);
  
        // removing elements
        vector::remove(&mut list, 3);
  
        // return and remove the last element (basically the pop function in python)
        let value2 = vector::pop_back(&mut list);
        print(&value2);
        list
    }
  
    fun update_element(element: &mut u64){
        let value = *element + 1;
        print(&value);
    }
  
    fun for_each_vector(list:vector<u64>){
        print(&utf8(b"For Each Mutable"));
        vector::for_each_mut(&mut list, |list| update_element(list));
    }
  
    fun vector_while_loop(list: vector<u64>): vector<u64> {
        let length = vector::length(&list);
        let i = 0;
        while (i < length) {
            let value = vector::borrow(&list, i);
            print(value);
            i = i + 1;
        };
        list
    }
  
    #[test]
    fun test_function(){
        let list = vector_basics();
        print(&list);
        let checker = vector::contains(&mut list, &10);
        print(&checker);
        print(&utf8(b"While Loop"));
        let listu = vector_while_loop(list);
  
        for_each_vector(list);
    }
}