@@ -53,6 +53,91 @@ test "from_array" {
5353 @assertion .assert_eq (pq .peek (), Some (5 ))?
5454}
5555
56+ fn copy_node [T ](x : Node [T ]) -> Node [T ] {
57+ match x {
58+ Nil => Nil
59+ Cons (top ) =>
60+ Cons (
61+ {
62+ content : top .content,
63+ sibling : copy_node (top .sibling),
64+ child : copy_node (top .child),
65+ },
66+ )
67+ }
68+ }
69+
70+ /// Return a copy of the queue.
71+ ///
72+ /// # Example
73+ /// ```
74+ /// let queue : PriorityQueue[Int] = PriorityQueue::[1, 2, 3, 4]
75+ /// let queue2 : PriorityQueue[Int] = PriorityQueue.copy()
76+ /// ```
77+ pub fn copy [T ](self : PriorityQueue [T ]) -> PriorityQueue [T ] {
78+ let new_que : PriorityQueue [T ] = { len : self .len, top : copy_node (self .top) }
79+ new_que
80+ }
81+
82+ test "copy" {
83+ let v = PriorityQueue ::[1 , 2 , 3 , 4 ]
84+ let ve = v .copy ()
85+ inspect (v .peek ().to_string (), content = "Some(4)" )?
86+ inspect (ve .peek ().to_string (), content = "Some(4)" )?
87+ v .pop () |> ignore
88+ inspect (v .peek ().to_string (), content = "Some(3)" )?
89+ inspect (ve .peek ().to_string (), content = "Some(4)" )?
90+ }
91+
92+ pub fn to_array [T : Compare ](self : PriorityQueue [T ]) -> Array [T ] {
93+ let arr : Array [T ] = []
94+ fn go (x : Node [T ]) {
95+ match x {
96+ Cons (node ) => {
97+ arr .push (node .content)
98+ go (node .sibling)
99+ go (node .child)
100+ }
101+ Nil => ()
102+ }
103+ }
104+
105+ go (self .top)
106+ arr .sort_by (fn (x , y ) { if x < y { 1 } else { - 1 } })
107+ arr
108+ }
109+
110+ test "to_array" {
111+ let v = PriorityQueue ::[1 , 2 , 3 , 4 ]
112+ inspect (v .to_array ().to_string (), content = "[4, 3, 2, 1]" )?
113+ inspect (v .to_array ().to_string (), content = "[4, 3, 2, 1]" )?
114+ }
115+
116+ pub fn as_iter [T : Compare ](self : PriorityQueue [T ]) -> @iter .Iter [T ] {
117+ @iter .Iter ::_unstable_internal_make (
118+ fn (yield ) {
119+ let arr = self .to_array ()
120+ for i = 0 ; i < arr .length (); i = i + 1 {
121+ if yield (arr [i ]).not () {
122+ break false
123+ }
124+ } else {
125+ true
126+ }
127+ },
128+ )
129+ }
130+
131+ test "as_iter" {
132+ let buf = Buffer ::make (20 )
133+ let v = PriorityQueue ::[1 , 2 , 3 ]
134+ v .as_iter ().iter (fn (e ) { buf .write_string ("[\(e)]" ) })
135+ inspect (buf , content = "[3][2][1]" )?
136+ buf .reset ()
137+ v .as_iter ().take (2 ).iter (fn (e ) { buf .write_string ("[\(e)]" ) })
138+ inspect (buf , content = "[3][2]" )?
139+ }
140+
56141fn meld [T : Compare ](x : Node [T ], y : Node [T ]) -> Node [T ] {
57142 match (x , y ) {
58143 (Nil , _ ) => y
0 commit comments