Skip to content

Commit 484cff5

Browse files
committed
Assert more default overloads
1 parent 7cbae04 commit 484cff5

File tree

2 files changed

+83
-10
lines changed

2 files changed

+83
-10
lines changed

src/FSharpPlus/Control/Collection.fs

+30-5
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,23 @@ open FSharpPlus.Internals
1313
type OfSeq =
1414
inherit Default1
1515

16-
static member inline OfSeq ((x: seq<'t> , _: 'R ), _: Default5) = (^R : (new : seq<'t> -> ^R) x) : 'R
17-
static member inline OfSeq ((x: seq<KeyValuePair<'k,'v>>, _: 'R ), _: Default5) = (^R : (new : seq<'k*'v> -> ^R) (Seq.map (|KeyValue|) x)) : 'R
16+
static member inline OfSeq ((x: seq<'t>, _: 'R), _: Default5) : 'R =
17+
#if TEST_TRACE
18+
Traces.add "OfSeq, Default5-seq<'t>"
19+
#endif
20+
(^R : (new : seq<'t> -> ^R) x)
21+
22+
static member inline OfSeq ((x: seq<KeyValuePair<'k,'v>>, _: 'R), _: Default5) : 'R =
23+
#if TEST_TRACE
24+
Traces.add "OfSeq, Default5-seq<KeyValuePair<'k,'v>>"
25+
#endif
26+
(^R : (new : seq<'k*'v> -> ^R) (Seq.map (|KeyValue|) x))
1827

19-
static member inline OfSeq ((x: seq<'t> , _: '``Foldable'<T>`` ), _: Default4) = x |> Seq.map Return.Invoke |> Sum.Invoke : '``Foldable'<T>``
28+
static member inline OfSeq ((x: seq<'t>, _: '``Foldable'<T>``), _: Default4) : '``Foldable'<T>`` =
29+
#if TEST_TRACE
30+
Traces.add "OfSeq, Default4-seq<'t>"
31+
#endif
32+
x |> Seq.map Return.Invoke |> Sum.Invoke
2033

2134
static member OfSeq ((x: seq<'t> , _: seq<'t> ), _: Default3) = x
2235
static member OfSeq ((x: seq<'t> , _: ICollection<'t> ), _: Default3) = let d = ResizeArray () in Seq.iter d.Add x; d :> ICollection<'t>
@@ -34,7 +47,13 @@ type OfSeq =
3447
static member OfSeq ((x: seq<'t> , _: IReadOnlyCollection<'t> ), _: Default3) = IReadOnlyCollection.ofSeq x
3548
#endif
3649

37-
static member inline OfSeq ((x: seq<'t> , _: 'F ), _: Default2) = let c = new 'F () in (Seq.iter (fun t -> ( ^F : (member Add : 't -> ^R) c, t) |> ignore) x); c
50+
static member inline OfSeq ((x: seq<'t>, _: 'F), _: Default2) =
51+
#if TEST_TRACE
52+
Traces.add "OfSeq, Default2-#Add"
53+
#endif
54+
let coll = new 'F ()
55+
(Seq.iter (fun t -> (^F : (member Add : 't -> ^R) coll, t) |> ignore) x)
56+
coll
3857

3958
#if !FABLE_COMPILER
4059
static member OfSeq ((x: seq<'t> , _: 'T when 'T :> ICollection<'t> ), _: Default1) = let d = new 'T () in x |> Seq.iter d.Add; d
@@ -83,7 +102,13 @@ type OfList =
83102
#endif
84103
static member OfList ((x: list<'t> , _: IReadOnlyCollection<'t> ), _: Default4) = IReadOnlyCollection.ofSeq x
85104

86-
static member inline OfList ((x: list<'t> , _: 'F ), _: Default2) = let c = new 'F () in (List.iter (fun t -> ( ^F : (member Add : 't -> ^R) c, t) |> ignore) x); c
105+
static member inline OfList ((x: list<'t>, _: 'F), _: Default2) =
106+
#if TEST_TRACE
107+
Traces.add "OfList, Default2-#Add"
108+
#endif
109+
let coll = new 'F ()
110+
List.iter (fun t -> (^F : (member Add : 't -> ^R) coll, t) |> ignore) x
111+
coll
87112

88113
#if !FABLE_COMPILER
89114
static member OfList ((x: list<'t> , _: 'T when 'T :> ICollection<'t> ), _: Default1) = let d = new 'T () in x |> List.iter d.Add; d

tests/FSharpPlus.Tests/Collections.fs

+53-5
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ module Collections =
2727

2828
#if TEST_TRACE
2929
CollectionAssert.AreEqual (["ChunkBy, list<'T>"], Traces.get())
30-
#endif
30+
#endif
3131

3232

3333
let testCollections =
@@ -52,6 +52,11 @@ module Collections =
5252

5353

5454
let testSeqConversions =
55+
56+
#if TEST_TRACE
57+
Traces.reset()
58+
#endif
59+
5560
let sk: Generic.Stack<_> = ofSeq { 1 .. 3 }
5661
let sg: string = ofSeq {'1'..'3'} // but it will come back as seq<char>
5762
let sb: Text.StringBuilder = ofSeq {'1'..'3'} // but it will come back as seq<char>
@@ -76,12 +81,29 @@ module Collections =
7681
let _r: IReadOnlyDictionary<_,_> = ofSeq (seq [KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
7782
let rc: IReadOnlyCollection<_> = ofSeq (seq [2..7])
7883
let ut: Hashtable = ofSeq (seq [1,'1';2, '2';3,'3']) // but it will come back as seq<obj>
84+
85+
#if TEST_TRACE
86+
CollectionAssert.AreEqual ([], Traces.get())
87+
#endif
88+
7989
let al: ArrayList = ofSeq (seq ["1";"2";"3"]) // but it will come back as seq<obj>
80-
let us: SortedList = ofSeq (seq [4,'2';3,'4']) // but it will come back as seq<obj>
90+
#if TEST_TRACE
91+
CollectionAssert.AreEqual (["OfSeq, Default2-#Add"], Traces.get())
92+
#endif
93+
8194
let cc: BlockingCollection<_> = ofSeq {'1'..'3'} // but it will come back as seq<obj>
95+
#if TEST_TRACE
96+
CollectionAssert.AreEqual (["OfSeq, Default2-#Add"; "OfSeq, Default2-#Add"], Traces.get())
97+
#endif
98+
99+
let cb: ConcurrentBag<_> = ofSeq {'1'..'3'}
100+
#if TEST_TRACE
101+
CollectionAssert.AreEqual (["OfSeq, Default2-#Add"; "OfSeq, Default2-#Add"; "OfSeq, Default2-#Add"], Traces.get())
102+
#endif
103+
104+
let us: SortedList = ofSeq (seq [4,'2';3,'4']) // but it will come back as seq<obj>
82105
let cd: ConcurrentDictionary<_,_> = ofSeq (seq [(1, "One"); (2, "Two")]) // but it will come back as ...
83106
let _cd:ConcurrentDictionary<_,_> = ofSeq (seq [KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
84-
let cb: ConcurrentBag<_> = ofSeq {'1'..'3'}
85107

86108
// now go back
87109
let _sk' = toSeq sk
@@ -119,7 +141,15 @@ module Collections =
119141
let _cols = columns |> toList |> map (fun x -> x.ColumnName)
120142

121143
// Defaults
144+
145+
#if TEST_TRACE
146+
CollectionAssert.AreEqual (["OfSeq, Default2-#Add"; "OfSeq, Default2-#Add"; "OfSeq, Default2-#Add"], Traces.get())
147+
#endif
148+
122149
let _12: WrappedListI<_> = seq [1;2] |> ofSeq
150+
#if TEST_TRACE
151+
CollectionAssert.AreEqual (["OfSeq, Default2-#Add"; "OfSeq, Default2-#Add"; "OfSeq, Default2-#Add"; "OfSeq, Default4-seq<'t>"], Traces.get())
152+
#endif
123153

124154
()
125155

@@ -150,12 +180,30 @@ module Collections =
150180
let _r: IReadOnlyDictionary<_,_> = ofList ([KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
151181
let rc: IReadOnlyCollection<_> = ofList ([2..5])
152182
let ut: Hashtable = ofList ([1,'1';2, '2';3,'3']) // but it will come back as seq<obj>
183+
184+
#if TEST_TRACE
185+
CollectionAssert.AreEqual ([], Traces.get())
186+
#endif
187+
153188
let al: ArrayList = ofList (["1";"2";"3"]) // but it will come back as seq<obj>
189+
#if TEST_TRACE
190+
CollectionAssert.AreEqual (["OfList, Default2-#Add"], Traces.get())
191+
#endif
192+
193+
let cc: BlockingCollection<_> = ofList ['1'..'3'] // but it will come back as seq<obj>
194+
#if TEST_TRACE
195+
CollectionAssert.AreEqual (["OfList, Default2-#Add"; "OfSeq, Default2-#Add"], Traces.get())
196+
#endif
197+
198+
let cb: ConcurrentBag<_> = ofList ['1'..'3']
199+
#if TEST_TRACE
200+
CollectionAssert.AreEqual (["OfList, Default2-#Add"; "OfSeq, Default2-#Add"; "OfSeq, Default2-#Add"], Traces.get())
201+
#endif
202+
203+
154204
let us: SortedList = ofList ([4,'2';3,'4']) // but it will come back as seq<obj>
155-
let cc: BlockingCollection<_> = ofList ['1'..'3'] // but it will come back as seq<obj>
156205
let cd: ConcurrentDictionary<_,_> = ofList ([(1, "One"); (2, "Two")]) // but it will come back as ...
157206
let _cd:ConcurrentDictionary<_,_> = ofList ([KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
158-
let cb: ConcurrentBag<_> = ofList ['1'..'3']
159207

160208
// now go back
161209
let _sk' = toList sk

0 commit comments

Comments
 (0)