@@ -42,11 +42,18 @@ module ComputationExpressions =
4242 type ASetBuilder () =
4343 member inline x.Yield ( value : 'T ) = ASet.single value
4444 member inline x.YieldFrom ( values : aset < 'T >) = values
45+ member inline x.YieldFrom ( values : cset < 'T >) = values :> aset<_>
4546 member inline x.YieldFrom ( values : seq < 'T >) = ASet.ofSeq values
4647 member inline x.YieldFrom ( values : list < 'T >) = ASet.ofList values
4748 member inline x.YieldFrom ( values : 'T []) = ASet.ofArray values
4849 member inline x.YieldFrom ( values : HashSet < 'T >) = ASet.ofHashSet values
4950
51+ member inline x.YieldFrom ( values : alist < 'T >) =
52+ ASet.ofAList values
53+
54+ member inline x.YieldFrom ( values : amap < 'K , 'V >) =
55+ ASet.ofAMap values
56+
5057 member inline x.YieldFrom ( values : aval < HashSet < 'T >>) =
5158 ASet.ofAVal values
5259
@@ -76,6 +83,15 @@ module ComputationExpressions =
7683 member inline x.For ( elements : aset < 'T1 >, mapping : 'T1 -> aset < 'T2 >) =
7784 ASet.collect mapping elements
7885
86+ member inline x.For ( elements : cset < 'T1 >, mapping : 'T1 -> aset < 'T2 >) =
87+ ASet.collect mapping elements
88+
89+ member inline x.For ( elements : alist < 'T1 >, mapping : 'T1 -> aset < 'T2 >) =
90+ elements |> AList.map mapping |> ASet.ofAList |> ASet.unionMany
91+
92+ member inline x.For ( elements : amap < 'K , 'V >, mapping : ( 'K * 'V ) -> aset < 'T >) =
93+ elements |> AMap.map ( fun k v -> mapping( k, v)) |> ASet.ofAMapValues |> ASet.unionMany
94+
7995 member inline x.For ( elements : seq < 'T1 >, mapping : 'T1 -> aset < 'T2 >) =
8096 elements |> Seq.map mapping |> ASet.ofSeq |> ASet.unionMany
8197
@@ -96,11 +112,23 @@ module ComputationExpressions =
96112 type AListBuilder () =
97113 member inline x.Yield ( value : 'T ) = AList.single value
98114 member inline x.YieldFrom ( values : alist < 'T >) = values
115+ member inline x.YieldFrom ( values : clist < 'T >) = values :> alist<_>
99116 member inline x.YieldFrom ( values : seq < 'T >) = AList.ofSeq values
100117 member inline x.YieldFrom ( values : list < 'T >) = AList.ofList values
101118 member inline x.YieldFrom ( values : 'T []) = AList.ofArray values
102119 member inline x.YieldFrom ( values : IndexList < 'T >) = AList.ofIndexList values
103-
120+
121+ member inline x.YieldFrom ( values : aval < IndexList < 'T >>) =
122+ AList.ofAVal values
123+
124+ member inline x.YieldFrom ( values : aval < seq < 'T >>) =
125+ AList.ofAVal ( AVal.map IndexList.ofSeq values)
126+
127+ member inline x.YieldFrom ( values : aval < list < 'T >>) =
128+ AList.ofAVal ( AVal.map IndexList.ofList values)
129+
130+ member inline x.YieldFrom ( values : aval < array < 'T >>) =
131+ AList.ofAVal ( AVal.map IndexList.ofArray values)
104132
105133
106134 member inline x.Bind ( value : aval < 'T1 >, mapping : 'T1 -> alist < 'T2 >) =
@@ -109,6 +137,9 @@ module ComputationExpressions =
109137 member inline x.For ( elements : alist < 'T1 >, mapping : 'T1 -> alist < 'T2 >) =
110138 AList.collect mapping elements
111139
140+ member inline x.For ( elements : clist < 'T1 >, mapping : 'T1 -> alist < 'T2 >) =
141+ AList.collect mapping elements
142+
112143 member inline x.For ( elements : seq < 'T1 >, mapping : 'T1 -> alist < 'T2 >) =
113144 elements |> Seq.map mapping |> AList.concat
114145
@@ -146,6 +177,7 @@ module ComputationExpressions =
146177
147178 member inline x.YieldFrom ( value : aval < HashMap < 'Key , 'Value >>) = AMap.ofAVal value
148179 member inline x.YieldFrom ( map : amap < 'Key , 'Value >) = map
180+ member inline x.YieldFrom ( map : cmap < 'Key , 'Value >) = map :> amap<_,_>
149181 member inline x.YieldFrom ( map : HashMap < 'Key , 'Value >) = AMap.ofHashMap map
150182 member inline x.YieldFrom ( map : ( 'Key * 'Value ) seq ) = AMap.ofSeq map
151183 member inline x.YieldFrom ( map : ( 'Key * 'Value ) list ) = AMap.ofList map
@@ -172,14 +204,21 @@ module ComputationExpressions =
172204 /// tests if some ComputationExpressions compile
173205 module private Test =
174206
175- let set ( e : aval < int >) ( some : aval < list < string >>) ( set : aset < int >) =
207+ let set ( e : aval < int >) ( some : aval < list < int >>) ( set : aset < int >) ( c : cset < int >) ( m : amap < int , string >) =
176208 aset {
177209 yield 1337
210+
211+ yield ! c
212+ yield ! AMap.keys m
178213
214+ yield ! some
179215 yield ! ( AVal.map Seq.singleton e)
180216 yield ! ( AVal.map List.singleton e)
181217 yield ! ( AVal.map Array.singleton e)
182218 yield ! ( AVal.map HashSet.single e)
219+
220+ for v in c do
221+ yield v
183222
184223 for v in set do
185224 yield v
@@ -195,22 +234,31 @@ module ComputationExpressions =
195234 ()
196235 }
197236
198- let list ( e : aval < int >) ( some : aval < list < string >>) ( list : alist < int >) =
237+ let list ( e : aval < int >) ( some : aval < list < int >>) ( list : alist < int >) ( c : clist < int >) =
199238 alist {
200239 yield 1
201240
241+ yield ! c
242+ yield ! list
243+ yield ! some
244+
245+ for e in c do
246+ yield 2 * e
247+
202248 for e in list do
203249 yield ! [ 2 * e; 2 * e+ 1 ]
204250
205251 let! v = e
206252 ()
207253 }
208254
209- let map ( k : aval < int >) ( v : aval < string >) =
255+ let map ( k : aval < int >) ( v : aval < string >) ( c : cmap < int , string >) =
210256 amap {
211257 // yield constant key and value
212258 yield ( 1 , " one" )
213259
260+ yield ! c
261+
214262 // yield adaptive tuple
215263 yield ! ( k |> AVal.map ( fun v -> v, string v))
216264
0 commit comments