Skip to content

Commit fabde1a

Browse files
Avoid unnecessary list use in productGen.
Also expose sequenceToArr and sequenceToSeq to F# users.
1 parent 0e06dc1 commit fabde1a

File tree

2 files changed

+9
-9
lines changed

2 files changed

+9
-9
lines changed

src/FsCheck/Gen.fs

+5-5
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ module Gen =
336336
map (fun (_, y, _) -> y) g,
337337
map (fun (_, _, z) -> z) g
338338

339-
///Sequence the given seq of generators into a generator of a list.
339+
/// Sequence the given enumerable of generators into a generator of a list.
340340
//[category: Creating generators from generators]
341341
[<CompiledName("SequenceToList"); EditorBrowsable(EditorBrowsableState.Never)>]
342342
let sequence l =
@@ -349,9 +349,9 @@ module Gen =
349349
go gs' (y::acc) size r2
350350
Gen(fun n r -> go (Seq.toList l) [] n r)
351351

352-
///Sequence the given list of generators into a generator of a list.
352+
/// Sequence the given enumerable of generators into a generator of an enumerable.
353353
//[category: Creating generators from generators]
354-
[<CompiledName("Sequence"); CompilerMessage("This method is not intended for use from F#.", 10001, IsHidden=true, IsError=false)>]
354+
[<CompiledName("Sequence")>]
355355
let sequenceToSeq generators =
356356
// This implementation is similar to that for arrays and lists but is specialized
357357
// to sequences to avoid intermediate conversion to an intermediate list.
@@ -364,9 +364,9 @@ module Gen =
364364
yield g size r1
365365
}
366366

367-
///Sequence the given array of generators into a generator of a array.
367+
/// Sequence the given array of generators into a generator of a array.
368368
//[category: Creating generators from generators]
369-
[<CompiledName("Sequence"); CompilerMessage("This method is not intended for use from F#.", 10001, IsHidden=true, IsError=false)>]
369+
[<CompiledName("Sequence")>]
370370
let sequenceToArr ([<ParamArrayAttribute>]generators:array<Gen<_>>) =
371371
if Object.ReferenceEquals (null, generators) then
372372
nullArg "generators"

src/FsCheck/ReflectArbitrary.fs

+4-4
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,13 @@ module internal ReflectArbitrary =
5858
fields |> Seq.exists (fun field -> isRecursive field containingType newSeen))
5959

6060
let productGen (ts : seq<Type>) create =
61-
let gs = [ for t in ts -> getGenerator t ]
61+
let gs = [| for t in ts -> getGenerator t |]
6262
let n = gs.Length
63-
if n = 0 then
63+
if n <= 0 then
6464
Gen.constant (create [||])
6565
else
66-
sized (fun s -> resize ((s / n) - 1) (sequence gs))
67-
|> map (List.toArray >> create)
66+
sized (fun s -> resize (max 0 ((s / n) - 1)) (sequenceToArr gs))
67+
|> map create
6868

6969
if isRecordType t then
7070
let fields = getRecordFieldTypes t

0 commit comments

Comments
 (0)