/// This class represents a vector of objects wrapped /// inside of a hot potato struct. module pyth::hot_potato_vector { use std::vector; friend pyth::pyth; #[test_only] friend pyth::pyth_tests; // A hot potato containing a vector of elements struct HotPotatoVector { contents: vector } // A public destroy function. public fun destroy(hot_potato_vector: HotPotatoVector) { let HotPotatoVector { contents: _ } = hot_potato_vector; } // Only certain on-chain functions are allowed to create a new hot potato vector. public(friend) fun new(vec: vector): HotPotatoVector { HotPotatoVector { contents: vec } } public fun length(potato: &HotPotatoVector): u64 { vector::length(&potato.contents) } public fun is_empty(potato: &HotPotatoVector): bool { vector::is_empty(&potato.contents) } public(friend) fun borrow(potato: &HotPotatoVector, i: u64): &T { vector::borrow(&potato.contents, i) } public(friend) fun pop_back(hot_potato_vector: HotPotatoVector): (T, HotPotatoVector) { let elem = vector::pop_back(&mut hot_potato_vector.contents); return (elem, hot_potato_vector) } #[test_only] struct A has copy, drop { a: u64 } #[test] fun test_hot_potato_vector() { let vec_of_a = vector::empty(); vector::push_back(&mut vec_of_a, A { a: 5 }); vector::push_back(&mut vec_of_a, A { a: 11 }); vector::push_back(&mut vec_of_a, A { a: 23 }); let hot_potato = new(vec_of_a); let (b, hot_potato) = pop_back(hot_potato); assert!(b.a == 23, 0); (b, hot_potato) = pop_back(hot_potato); assert!(b.a == 11, 0); let (b, hot_potato) = pop_back(hot_potato); assert!(b.a == 5, 0); destroy(hot_potato); } }