Skip to content

Commit c7cff08

Browse files
committed
Merge branch 'master' into v1.6
2 parents cc263ec + b2ce89d commit c7cff08

File tree

5 files changed

+52
-4
lines changed

5 files changed

+52
-4
lines changed

docsrc/content/abstraction-zipapplicative.fsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ let arr2 = (+) <!> [|1;2;3|] <.> [|10;20;30|]
127127

128128
// Validations
129129

130-
let validated = app2 {
130+
let validated = applicative2' {
131131
let! x = async { return Ok 1 }
132132
and! y = async { return Ok 2 }
133133
and! z = async { return Error ["Error"] }

src/FSharpPlus.TypeLevel/Data/Matrix.fs

+29
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ namespace FSharpPlus.Data
33
#if !FABLE_COMPILER
44

55
open System.Runtime.CompilerServices
6+
open System.ComponentModel
67
open FSharpPlus.Control
78
open FSharpPlus.TypeLevel
89
open TypeLevelOperators
@@ -294,6 +295,13 @@ module Matrix =
294295
{ Items =
295296
Array2D.init (Array2D.length1 m1.Items) (Array2D.length2 m1.Items)
296297
(fun i j -> f m1.Items.[i, j] m2.Items.[i, j] ) }
298+
299+
[<MethodImpl(MethodImplOptions.AggressiveInlining)>]
300+
let map3 (f: 'a -> 'b -> 'c -> 'd) (m1: Matrix<'a, 'm, 'n>) (m2: Matrix<'b, 'm, 'n>) (m3: Matrix<'c, 'm, 'n>) : Matrix<'d, 'm, 'n> =
301+
{ Items =
302+
Array2D.init (Array2D.length1 m1.Items) (Array2D.length2 m1.Items)
303+
(fun i j -> f m1.Items.[i, j] m2.Items.[i, j] m3.Items.[i, j] ) }
304+
297305
[<MethodImpl(MethodImplOptions.AggressiveInlining)>]
298306
let mapi (f: int -> int -> 'a -> 'b) (m: Matrix<'a, 'm, 'n>) : Matrix<'b, 'm, 'n> =
299307
{ Items = Array2D.mapi (fun i j -> f i j) m.Items }
@@ -554,8 +562,17 @@ module Matrix =
554562
type Matrix<'Item, 'Row, 'Column> with
555563
static member inline Item (mtx: Matrix<'a, 'm, 'n>, (m, n)) = Matrix.get m n mtx
556564
static member inline Map (mtx: Matrix<'a, 'm, 'n>, f: 'a -> 'b) = Matrix.map f mtx
565+
566+
[<EditorBrowsable(EditorBrowsableState.Never)>]
567+
static member inline Map2 (f, m1, m2) : Matrix<'x, 'm, 'n> = Matrix.map2 f m1 m2
568+
569+
[<EditorBrowsable(EditorBrowsableState.Never)>]
570+
static member inline Map3 (f, m1, m2, m3) : Matrix<'x, 'm, 'n> = Matrix.map3 f m1 m2 m3
571+
557572
static member inline Return (x: 'x) : Matrix<'x, 'm, 'n> = Matrix.replicate Singleton Singleton x
573+
static member inline Pure (x: 'x) : Matrix<'x, 'm, 'n> = Matrix.replicate Singleton Singleton x
558574
static member inline ( <*> ) (f: Matrix<'x -> 'y, 'm, 'n>, x: Matrix<'x, 'm, 'n>) = Matrix.map2 id f x
575+
static member inline ( <.> ) (f: Matrix<'x -> 'y, 'm, 'n>, x: Matrix<'x, 'm, 'n>) = Matrix.map2 id f x
559576
static member inline get_Zero () : Matrix<'a, 'm, 'n> = Matrix.zero
560577
static member inline ( + ) (m1, m2) = Matrix.map2 (+) m1 m2
561578
static member inline ( - ) (m1, m2) = Matrix.map2 (-) m1 m2
@@ -579,9 +596,21 @@ type Matrix<'Item, 'Row, 'Column> with
579596
type Vector<'Item, 'Length> with
580597
static member inline Item (v: Vector<'a, 'n>, i) = Vector.get i v
581598
static member inline Map (v: Vector<'a, 'n>, f: 'a -> 'b) : Vector<'b, 'n> = Vector.map f v
599+
600+
[<EditorBrowsable(EditorBrowsableState.Never)>]
601+
static member inline Map2 (f, vec1, vec2) : Vector<'x, 'n> = Vector.map2 f vec1 vec2
602+
603+
[<EditorBrowsable(EditorBrowsableState.Never)>]
604+
static member inline Map3 (f, vec1, vec2, vec3) : Vector<'x, 'n> = Vector.map3 f vec1 vec2 vec3
605+
582606
static member inline Return (x: 'x) : Vector<'x, 'n> = Vector.replicate Singleton x
607+
static member inline Pure (x: 'x) : Vector<'x, 'n> = Vector.replicate Singleton x
583608
static member inline ( <*> ) (f: Vector<'x -> 'y, 'n>, x: Vector<'x, 'n>) : Vector<'y, 'n> = Vector.apply f x
609+
static member inline ( <.> ) (f: Vector<'x -> 'y, 'n>, x: Vector<'x, 'n>) : Vector<'y, 'n> = Vector.apply f x
610+
611+
[<EditorBrowsable(EditorBrowsableState.Never)>]
584612
static member inline Zip (x, y) = Vector.zip x y
613+
585614
static member inline get_Zero () : Vector<'x, 'n> = Vector.zero
586615
static member inline ( + ) (v1: Vector<_, 'n>, v2: Vector<_, 'n>) = Vector.map2 (+) v1 v2
587616
static member inline ( - ) (v1: Vector<_, 'n>, v2: Vector<_, 'n>) = Vector.map2 (-) v1 v2

src/FSharpPlus/Builders.fs

+15-2
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,16 @@ module GenericBuilders =
400400
member inline _.MergeSources3 (t1, t2, t3) : '``Applicative1<Applicative2<'T>>`` = (map3 >> map3) tuple3 t1 t2 t3
401401
member _.Run x : '``Applicative1<Applicative2<'T>>`` = x
402402

403+
/// Generic 3 layers ZipApplicative CE builder.
404+
type ZipApplicativeBuilder3<'``applicative1<applicative2<applicative3<'t>>>``> () =
405+
member _.ReturnFrom expr : '``applicative1<applicative2<applicative3<'t>>>`` = expr
406+
member inline _.Return (x: 'T) : '``Applicative1<Applicative2<Applicative3<'T>>>`` = (pur >> pur >> pur) x
407+
member inline _.Yield (x: 'T) : '``Applicative1<Applicative2<Applicative3<'T>>>`` = (pur >> pur >> pur) x
408+
member inline _.BindReturn (x: '``Applicative1<Applicative2<Applicative3<'T>>>``, [<InlineIfLambda>]f: _ -> _) : '``Applicative1<Applicative2<'U>>`` = (map >> map >> map) f x
409+
member inline _.MergeSources (t1, t2) : '``Applicative1<Applicative2<Applicative3<'T>>>`` = (map2 >> map2 >> map2) tuple2 t1 t2
410+
member inline _.MergeSources3 (t1, t2, t3) : '``Applicative1<Applicative2<Applicative3<'T>>>`` = (map3 >> map3 >> map3) tuple3 t1 t2 t3
411+
member _.Run x : '``Applicative1<Applicative2<Applicative3<'T>>>`` = x
412+
403413
/// Creates a (lazy) monadic computation expression with side-effects (see http://fsprojects.github.io/FSharpPlus/computation-expressions.html for more information)
404414
let monad<'``monad<'t>``> = new MonadFxBuilder<'``monad<'t>``> ()
405415

@@ -416,9 +426,12 @@ module GenericBuilders =
416426
let applicative3<'``Applicative1<Applicative2<Applicative3<'T>>>``> = ApplicativeBuilder3<'``Applicative1<Applicative2<Applicative3<'T>>>``> ()
417427

418428
/// Creates a (non sequential) applicative computation expression.
419-
let app<'``ZipApplicative<'T>``> = ZipApplicativeBuilder<'``ZipApplicative<'T>``> ()
429+
let applicative'<'``ZipApplicative<'T>``> = ZipApplicativeBuilder<'``ZipApplicative<'T>``> ()
420430

421431
/// Creates a (non sequential) applicative computation expression which compose effects of two Applicatives.
422-
let app2<'``ZipApplicative1<ZipApplicative2<'T>>``> = ZipApplicativeBuilder2<'``ZipApplicative1<ZipApplicative2<'T>>``> ()
432+
let applicative2'<'``ZipApplicative1<ZipApplicative2<'T>>``> = ZipApplicativeBuilder2<'``ZipApplicative1<ZipApplicative2<'T>>``> ()
433+
434+
/// Creates a (non sequential) applicative computation expression which compose effects of three Applicatives.
435+
let applicative3'<'``Applicative1<Applicative2<Applicative3<'T>>>``> = ZipApplicativeBuilder3<'``Applicative1<Applicative2<Applicative3<'T>>>``> ()
423436

424437
#endif

src/FSharpPlus/Operators.fs

+6
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ module Operators =
5454
/// <category index="0">Common Combinators</category>
5555
let inline (/>) x = flip x
5656

57+
/// <summary>
58+
/// Executes a side-effect function and returns the original input value. Same as 'tap' but with arguments flipped.
59+
/// </summary>
60+
/// <category index="0">Common Combinators</category>
61+
let inline (|-) source ([<InlineIfLambda>]f: 'T -> unit) = f source; source
62+
5763
/// <summary>
5864
/// Executes a side-effect function and returns the original input value.
5965
/// </summary>

tests/FSharpPlus.Tests/Applicatives.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ module Applicatives =
2020

2121
[<Test>]
2222
let zipApply () =
23-
let arr1 = app2 {
23+
let arr1 = applicative2' {
2424
let! x1 = async { return [|1; 2; 3|] }
2525
and! x2 = async { return [|10; 20; 30|] }
2626
and! x3 = async { return [|100; 200; 300|] }

0 commit comments

Comments
 (0)