Skip to content

Commit f1399bc

Browse files
committed
Add VOption to FoldMap and FoldBack
1 parent 9468253 commit f1399bc

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
@@ -113,16 +113,21 @@ type ToArray =
113113

114114
type FoldBack =
115115
inherit Default1
116-
static member inline FoldBack (x: 'F , f: 'a->'b->'b, z: 'b , [<Optional>]_impl: Default2) = List.foldBack f (ToList.Invoke x) z
116+
static member inline FoldBack (x: 'F, f: 'a -> 'b -> 'b, z: 'b, [<Optional>]_impl: Default2) =
117+
#if TEST_TRACE
118+
Traces.add "Foldback Default"
119+
#endif
120+
List.foldBack f (ToList.Invoke x) z
117121
static member inline FoldBack (x: 'F , f: 'a->'b->'b, z: 'b , [<Optional>]_impl: Default1) = (^F : (static member FoldBack : ^F -> _ -> _-> ^b) x, f, z)
118-
static member FoldBack (x: seq<_> , f , z , [<Optional>]_impl: FoldBack) = List.foldBack f (Seq.toList x) z
119-
static member FoldBack (x: option<_> , f , z , [<Optional>]_impl: FoldBack) = match x with Some x -> f x z | _ -> z
122+
static member FoldBack (x: seq<_> , f , z , [<Optional>]_impl: FoldBack) = List.foldBack f (Seq.toList x) z
123+
static member FoldBack (x: option<_> , f , z , [<Optional>]_impl: FoldBack) = match x with Some x -> f x z | _ -> z
124+
static member FoldBack (x: voption<_> , f , z , [<Optional>]_impl: FoldBack) = match x with ValueSome x -> f x z | _ -> z
120125
static member FoldBack (x: list<_> , f , z , [<Optional>]_impl: FoldBack) = List.foldBack f x z
121126
static member FoldBack (x: _ [] , f , z , [<Optional>]_impl: FoldBack) = Array.foldBack f x z
122127
static member FoldBack (x: Set<_> , f , z , [<Optional>]_impl: FoldBack) = Set.foldBack f x z
123128
static member FoldBack (x: _ ResizeArray, f , z , [<Optional>]_impl: FoldBack) = Array.foldBack f (x.ToArray ()) z
124129
static member FoldBack (x: string , f , z , [<Optional>]_impl: FoldBack) = Array.foldBack f (x.ToCharArray ()) z
125-
static member FoldBack (x: StringBuilder, f , z , [<Optional>]_impl: FoldBack) = Array.foldBack f (x.ToString().ToCharArray ()) z
130+
static member FoldBack (x: StringBuilder, f , z , [<Optional>]_impl: FoldBack) = Array.foldBack f (x.ToString().ToCharArray ()) z
126131
static member FoldBack (x: Id<'a> , f , z , [<Optional>]_impl: FoldBack) = f x.getValue z
127132

128133
static member inline Invoke (folder: 'T->'State->'State) (state: 'State) (foldable: '``Foldable'<T>``) : 'State =
@@ -136,18 +141,23 @@ type FoldMap =
136141

137142
static member inline FromFoldFoldBack f x = FoldBack.Invoke (Plus.Invoke << f) (Zero.Invoke ()) x
138143

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

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

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

0 commit comments

Comments
 (0)