1010
1111#[ feature( managed_boxes) ] ;
1212
13+ use std:: cell:: RefCell ;
14+
1315pub struct Entry < A , B > {
1416 key : A ,
1517 value : B
1618}
1719
1820pub struct alist < A , B > {
1921 eq_fn : extern "Rust" fn ( A , A ) -> bool ,
20- data : @mut ~[ Entry < A , B > ]
22+ data : @RefCell < ~[ Entry < A , B > ] > ,
2123}
2224
2325pub fn alist_add < A : ' static , B : ' static > ( lst : & alist < A , B > , k : A , v : B ) {
24- lst. data . push ( Entry { key : k, value : v} ) ;
26+ let mut data = lst. data . borrow_mut ( ) ;
27+ data. get ( ) . push ( Entry { key : k, value : v} ) ;
2528}
2629
2730pub fn alist_get < A : Clone + ' static ,
@@ -30,7 +33,8 @@ pub fn alist_get<A:Clone + 'static,
3033 k : A )
3134 -> B {
3235 let eq_fn = lst. eq_fn ;
33- for entry in lst. data . iter ( ) {
36+ let data = lst. data . borrow ( ) ;
37+ for entry in data. get ( ) . iter ( ) {
3438 if eq_fn ( entry. key . clone ( ) , k. clone ( ) ) {
3539 return entry. value . clone ( ) ;
3640 }
@@ -41,12 +45,18 @@ pub fn alist_get<A:Clone + 'static,
4145#[ inline]
4246pub fn new_int_alist < B : ' static > ( ) -> alist < int , B > {
4347 fn eq_int ( a : int , b : int ) -> bool { a == b }
44- return alist { eq_fn : eq_int, data : @mut ~[ ] } ;
48+ return alist {
49+ eq_fn : eq_int,
50+ data : @RefCell :: new ( ~[ ] ) ,
51+ } ;
4552}
4653
4754#[ inline]
4855pub fn new_int_alist_2 < B : ' static > ( ) -> alist < int , B > {
4956 #[ inline]
5057 fn eq_int ( a : int , b : int ) -> bool { a == b }
51- return alist { eq_fn : eq_int, data : @mut ~[ ] } ;
58+ return alist {
59+ eq_fn : eq_int,
60+ data : @RefCell :: new ( ~[ ] ) ,
61+ } ;
5262}
0 commit comments