Skip to content

Commit e4d5843

Browse files
committed
Assert more default overloads
1 parent 142c806 commit e4d5843

File tree

2 files changed

+83
-10
lines changed

2 files changed

+83
-10
lines changed

src/FSharpPlus/Control/Collection.fs

Lines changed: 30 additions & 5 deletions
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

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ module Collections =
2828

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

3333

3434
let testCollections =
@@ -53,6 +53,11 @@ module Collections =
5353

5454

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

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

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

125155
()
126156

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

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

0 commit comments

Comments
 (0)