@@ -8,10 +8,9 @@ use crate::builtins;
88use crate :: builtins:: utils:: { ensure_args_count, ensure_set} ;
99use crate :: lexer:: Span ;
1010use crate :: value:: Value ;
11+ use crate :: Set ;
1112use crate :: * ;
1213
13- use alloc:: collections:: BTreeSet ;
14-
1514use anyhow:: { bail, Result } ;
1615
1716pub fn register ( m : & mut builtins:: BuiltinsMap < & ' static str , builtins:: BuiltinFcn > ) {
@@ -24,19 +23,19 @@ pub fn register(m: &mut builtins::BuiltinsMap<&'static str, builtins::BuiltinFcn
2423pub fn intersection ( expr1 : & Expr , expr2 : & Expr , v1 : Value , v2 : Value ) -> Result < Value > {
2524 let s1 = ensure_set ( "intersection" , expr1, v1) ?;
2625 let s2 = ensure_set ( "intersection" , expr2, v2) ?;
27- Ok ( Value :: from_set ( s1. intersection ( & s2) . cloned ( ) . collect ( ) ) )
26+ Ok ( s1. intersection ( & s2) . into_value ( ) )
2827}
2928
3029pub fn union ( expr1 : & Expr , expr2 : & Expr , v1 : Value , v2 : Value ) -> Result < Value > {
3130 let s1 = ensure_set ( "union" , expr1, v1) ?;
3231 let s2 = ensure_set ( "union" , expr2, v2) ?;
33- Ok ( Value :: from_set ( s1. union ( & s2) . cloned ( ) . collect ( ) ) )
32+ Ok ( s1. union ( & s2) . into_value ( ) )
3433}
3534
3635pub fn difference ( expr1 : & Expr , expr2 : & Expr , v1 : Value , v2 : Value ) -> Result < Value > {
3736 let s1 = ensure_set ( "difference" , expr1, v1) ?;
3837 let s2 = ensure_set ( "difference" , expr2, v2) ?;
39- Ok ( Value :: from_set ( s1. difference ( & s2) . cloned ( ) . collect ( ) ) )
38+ Ok ( s1. difference ( & s2) . into_value ( ) )
4039}
4140
4241fn binary_set_union (
@@ -49,7 +48,7 @@ fn binary_set_union(
4948 ensure_args_count ( span, name, params, args, 2 ) ?;
5049 let left = ensure_set ( name, & params[ 0 ] , args[ 0 ] . clone ( ) ) ?;
5150 let right = ensure_set ( name, & params[ 1 ] , args[ 1 ] . clone ( ) ) ?;
52- Ok ( Value :: from_set ( left. union ( & right) . cloned ( ) . collect ( ) ) )
51+ Ok ( left. union ( & right) . into_value ( ) )
5352}
5453
5554fn binary_set_intersection (
@@ -62,9 +61,7 @@ fn binary_set_intersection(
6261 ensure_args_count ( span, name, params, args, 2 ) ?;
6362 let left = ensure_set ( name, & params[ 0 ] , args[ 0 ] . clone ( ) ) ?;
6463 let right = ensure_set ( name, & params[ 1 ] , args[ 1 ] . clone ( ) ) ?;
65- Ok ( Value :: from_set (
66- left. intersection ( & right) . cloned ( ) . collect ( ) ,
67- ) )
64+ Ok ( left. intersection ( & right) . into_value ( ) )
6865}
6966
7067fn intersection_of_set_of_sets (
@@ -77,8 +74,7 @@ fn intersection_of_set_of_sets(
7774 ensure_args_count ( span, name, params, args, 1 ) ?;
7875 let set = ensure_set ( name, & params[ 0 ] , args[ 0 ] . clone ( ) ) ?;
7976
80- let mut res = BTreeSet :: new ( ) ;
81- let mut first = true ;
77+ let mut res: Option < Set > = None ;
8278
8379 for s in set. iter ( ) {
8480 let s = match s {
@@ -88,15 +84,13 @@ fn intersection_of_set_of_sets(
8884 ) ,
8985 } ;
9086
91- if first {
92- res. clone_from ( s) ;
93- first = false ;
94- } else {
95- res = res. intersection ( s) . cloned ( ) . collect ( ) ;
96- }
87+ res = Some ( match res {
88+ None => ( * * s) . clone ( ) ,
89+ Some ( prev) => prev. intersection ( s) ,
90+ } ) ;
9791 }
9892
99- Ok ( Value :: from_set ( res) )
93+ Ok ( res. unwrap_or_default ( ) . into_value ( ) )
10094}
10195
10296fn union_of_set_of_sets (
@@ -109,7 +103,7 @@ fn union_of_set_of_sets(
109103 ensure_args_count ( span, name, params, args, 1 ) ?;
110104 let set = ensure_set ( name, & params[ 0 ] , args[ 0 ] . clone ( ) ) ?;
111105
112- let mut res = BTreeSet :: new ( ) ;
106+ let mut res = Set :: new ( ) ;
113107
114108 for s in set. iter ( ) {
115109 let s = match s {
@@ -119,8 +113,8 @@ fn union_of_set_of_sets(
119113 ) ,
120114 } ;
121115
122- res = res. union ( s) . cloned ( ) . collect ( ) ;
116+ res = res. union ( s) ;
123117 }
124118
125- Ok ( Value :: from_set ( res) )
119+ Ok ( res. into_value ( ) )
126120}
0 commit comments