Skip to content

Commit b8e9e7d

Browse files
committed
Add VOption to Fold
1 parent 1446d18 commit b8e9e7d

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

src/FSharpPlus/Control/Foldable.fs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -158,14 +158,20 @@ type Fold =
158158

159159
static member inline FromFoldMap f z t = let (f: _Dual<_Endo<'t>>) = FoldMap.Invoke (_Dual << _Endo << flip f) t in f.Value.Value z
160160

161-
static member inline Fold (x , f, z, [<Optional>]_impl: Default2) = Seq.fold f z (ToSeq.Invoke x)
162-
static member inline Fold (x: 'F , f: 'b->'a->'b, z: 'b, [<Optional>]_impl: Default1) = (^F : (static member Fold : ^F -> _ -> _-> ^b) x, f, z)
163-
static member Fold (x: option<_>, f, z , [<Optional>]_impl: Fold ) = match x with Some x -> f z x | _ -> z
164-
static member Fold (x: Id<_> , f, z , [<Optional>]_impl: Fold ) = f z x.getValue
165-
static member Fold (x: seq<_> , f, z , [<Optional>]_impl: Fold ) = Seq.fold f z x
166-
static member Fold (x: list<_> , f, z , [<Optional>]_impl: Fold ) = List.fold f z x
167-
static member Fold (x: Set<_> , f, z , [<Optional>]_impl: Fold ) = Set.fold f z x
168-
static member Fold (x: _ [] , f, z , [<Optional>]_impl: Fold ) = Array.fold f z x
161+
static member inline Fold (x , f, z, [<Optional>]_impl: Default2) =
162+
#if TEST_TRACE
163+
Traces.add "Fold Default"
164+
#endif
165+
Seq.fold f z (ToSeq.Invoke x)
166+
167+
static member inline Fold (x: 'F , f: 'b->'a->'b, z: 'b, [<Optional>]_impl: Default1) = (^F : (static member Fold : ^F -> _ -> _-> ^b) x, f, z)
168+
static member Fold (x: option<_> , f, z , [<Optional>]_impl: Fold ) = match x with Some x -> f z x | _ -> z
169+
static member Fold (x: voption<_>, f, z , [<Optional>]_impl: Fold ) = match x with ValueSome x -> f z x | _ -> z
170+
static member Fold (x: Id<_> , f, z , [<Optional>]_impl: Fold ) = f z x.getValue
171+
static member Fold (x: seq<_> , f, z , [<Optional>]_impl: Fold ) = Seq.fold f z x
172+
static member Fold (x: list<_> , f, z , [<Optional>]_impl: Fold ) = List.fold f z x
173+
static member Fold (x: Set<_> , f, z , [<Optional>]_impl: Fold ) = Set.fold f z x
174+
static member Fold (x: _ [] , f, z , [<Optional>]_impl: Fold ) = Array.fold f z x
169175

170176
static member inline Invoke (folder: 'State->'T->'State) (state: 'State) (foldable: '``Foldable'<T>``) : 'State =
171177
let inline call_2 (a: ^a, b: ^b, f, z) = ((^a or ^b) : (static member Fold : _*_*_*_ -> _) b, f, z, a)

tests/FSharpPlus.Tests/Folds.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ module Folds =
2626
let r1 = set [1..3] |> fold (+) 0
2727
let r2 = set [1..3] |> toSeq
2828
let r3 = ValueSome 1 |> toSeq
29+
let r4 = ValueSome 1 |> fold (+) 0
2930
Assert.AreEqual (6, r1)
3031
CollectionAssert.AreEqual ([1; 2; 3], r2)
3132
CollectionAssert.AreEqual ([1], r3)
33+
Assert.AreEqual (1, r4)
3234
#if TEST_TRACE
3335
CollectionAssert.AreEqual (["ToSeq seq"], Traces.get())
3436
#endif

0 commit comments

Comments
 (0)