Skip to content

Commit 2a428be

Browse files
committed
Add VOption to FoldMap and FoldBack
1 parent b8e9e7d commit 2a428be

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

src/FSharpPlus/Control/Foldable.fs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -111,16 +111,21 @@ type ToArray =
111111

112112
type FoldBack =
113113
inherit Default1
114-
static member inline FoldBack (x: 'F , f: 'a->'b->'b, z: 'b , [<Optional>]_impl: Default2) = List.foldBack f (ToList.Invoke x) z
114+
static member inline FoldBack (x: 'F, f: 'a -> 'b -> 'b, z: 'b, [<Optional>]_impl: Default2) =
115+
#if TEST_TRACE
116+
Traces.add "Foldback Default"
117+
#endif
118+
List.foldBack f (ToList.Invoke x) z
115119
static member inline FoldBack (x: 'F , f: 'a->'b->'b, z: 'b , [<Optional>]_impl: Default1) = (^F : (static member FoldBack : ^F -> _ -> _-> ^b) x, f, z)
116-
static member FoldBack (x: seq<_> , f , z , [<Optional>]_impl: FoldBack) = List.foldBack f (Seq.toList x) z
117-
static member FoldBack (x: option<_> , f , z , [<Optional>]_impl: FoldBack) = match x with Some x -> f x z | _ -> z
120+
static member FoldBack (x: seq<_> , f , z , [<Optional>]_impl: FoldBack) = List.foldBack f (Seq.toList x) z
121+
static member FoldBack (x: option<_> , f , z , [<Optional>]_impl: FoldBack) = match x with Some x -> f x z | _ -> z
122+
static member FoldBack (x: voption<_> , f , z , [<Optional>]_impl: FoldBack) = match x with ValueSome x -> f x z | _ -> z
118123
static member FoldBack (x: list<_> , f , z , [<Optional>]_impl: FoldBack) = List.foldBack f x z
119124
static member FoldBack (x: _ [] , f , z , [<Optional>]_impl: FoldBack) = Array.foldBack f x z
120125
static member FoldBack (x: Set<_> , f , z , [<Optional>]_impl: FoldBack) = Set.foldBack f x z
121126
static member FoldBack (x: _ ResizeArray, f , z , [<Optional>]_impl: FoldBack) = Array.foldBack f (x.ToArray ()) z
122127
static member FoldBack (x: string , f , z , [<Optional>]_impl: FoldBack) = Array.foldBack f (x.ToCharArray ()) z
123-
static member FoldBack (x: StringBuilder, f , z , [<Optional>]_impl: FoldBack) = Array.foldBack f (x.ToString().ToCharArray ()) z
128+
static member FoldBack (x: StringBuilder, f , z , [<Optional>]_impl: FoldBack) = Array.foldBack f (x.ToString().ToCharArray ()) z
124129
static member FoldBack (x: Id<'a> , f , z , [<Optional>]_impl: FoldBack) = f x.getValue z
125130

126131
static member inline Invoke (folder: 'T->'State->'State) (state: 'State) (foldable: '``Foldable'<T>``) : 'State =
@@ -134,18 +139,23 @@ type FoldMap =
134139

135140
static member inline FromFoldFoldBack f x = FoldBack.Invoke (Plus.Invoke << f) (Zero.Invoke ()) x
136141

137-
static member inline FoldMap (x: option<_>, f, [<Optional>]_impl: FoldMap ) = match x with Some x -> f x | _ -> Zero.Invoke ()
138-
static member inline FoldMap (x: list<_> , f, [<Optional>]_impl: FoldMap ) = List.fold (fun x y -> Plus.Invoke x (f y)) (Zero.Invoke ()) x
139-
static member inline FoldMap (x: Set<_> , f, [<Optional>]_impl: FoldMap ) = Seq.fold (fun x y -> Plus.Invoke x (f y)) (Zero.Invoke ()) x
140-
static member inline FoldMap (x: _ [] , f, [<Optional>]_impl: FoldMap ) = Array.fold (fun x y -> Plus.Invoke x (f y)) (Zero.Invoke ()) x
142+
static member inline FoldMap (x: option<_> , f, [<Optional>]_impl: FoldMap) = match x with Some x -> f x | _ -> Zero.Invoke ()
143+
static member inline FoldMap (x: voption<_>, f, [<Optional>]_impl: FoldMap) = match x with ValueSome x -> f x | _ -> Zero.Invoke ()
144+
static member inline FoldMap (x: list<_> , f, [<Optional>]_impl: FoldMap) = List.fold (fun x y -> Plus.Invoke x (f y)) (Zero.Invoke ()) x
145+
static member inline FoldMap (x: Set<_> , f, [<Optional>]_impl: FoldMap) = Seq.fold (fun x y -> Plus.Invoke x (f y)) (Zero.Invoke ()) x
146+
static member inline FoldMap (x: _ [] , f, [<Optional>]_impl: FoldMap) = Array.fold (fun x y -> Plus.Invoke x (f y)) (Zero.Invoke ()) x
141147

142148
static member inline Invoke (f: 'T->'Monoid) (x: '``Foldable'<T>``) : 'Monoid =
143149
let inline call_2 (a: ^a, b: ^b, f) = ((^a or ^b) : (static member FoldMap : _*_*_ -> _) b, f, a)
144150
let inline call (a: 'a, b: 'b, f) = call_2 (a, b, f)
145151
call (Unchecked.defaultof<FoldMap>, x, f)
146152

147153
type FoldMap with
148-
static member inline FoldMap (x: seq<_> , f, [<Optional>]_impl: Default2) = Seq.fold (fun x y -> Plus.Invoke x (f y)) (Zero.Invoke ()) x
154+
static member inline FoldMap (x: seq<_> , f, [<Optional>]_impl: Default2) =
155+
#if TEST_TRACE
156+
Traces.add "FoldMap Default"
157+
#endif
158+
Seq.fold (fun x y -> Plus.Invoke x (f y)) (Zero.Invoke ()) x
149159
static member inline FoldMap (x , f, [<Optional>]_impl: Default1) = (^F : (static member FoldMap : ^F -> _ -> _) x, f)
150160
static member inline FoldMap (_: ^t when ^t: null and ^t: struct, _, _: Default1) = ()
151161

0 commit comments

Comments
 (0)