From f55fcd92c7d728f632ff77c7180aaa217aeff426 Mon Sep 17 00:00:00 2001 From: sigma-andex <77549848+sigma-andex@users.noreply.github.com> Date: Thu, 9 Jun 2022 13:46:10 +0100 Subject: [PATCH 1/2] Add merge flipped --- CHANGELOG.md | 1 + src/Record.purs | 44 ++++++++++++++++++++++++++++++++++---------- test/Main.purs | 4 +++- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e4e6c5..deb481b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Notable changes to this project are documented in this file. The format is based Breaking changes: New features: +- Add `mergeFlipped` and infix operator `//` Bugfixes: diff --git a/src/Record.purs b/src/Record.purs index 11154ca..4ac39d0 100644 --- a/src/Record.purs +++ b/src/Record.purs @@ -1,18 +1,21 @@ module Record - ( get - , set - , modify - , insert + ( (//) + , class EqualFields , delete - , rename + , disjointUnion , equal + , equalFields + , get + , insert , merge - , union - , disjointUnion + , mergeFlipped + , modify , nub - , class EqualFields - , equalFields - ) where + , rename + , set + , union + ) + where import Prelude @@ -168,6 +171,27 @@ merge -> Record r4 merge l r = runFn2 unsafeUnionFn l r +-- | Like `merge` but with its arguments flipped. I.e. merges two records with the seconds record's labels taking precedence in the +-- | case of overlaps. +-- | +-- | For example: +-- | +-- | ```purescript +-- | merge { x: 1, y: "y" } { y: 2, z: true } +-- | :: { x :: Int, y :: Int, z :: Boolean } +-- | ``` +mergeFlipped + :: forall r1 r2 r3 r4 + . Union r1 r2 r3 + => Nub r3 r4 + => Record r2 + -> Record r1 + -> Record r4 +mergeFlipped = flip merge + +-- | Operator alias for mergeFlipped (right-associative / precedence 1) +infixr 1 mergeFlipped as // + -- | Merges two records with the first record's labels taking precedence in the -- | case of overlaps. Unlike `merge`, this does not remove duplicate labels -- | from the resulting record type. This can result in better inference for diff --git a/test/Main.purs b/test/Main.purs index 124f3cd..5fdb26e 100644 --- a/test/Main.purs +++ b/test/Main.purs @@ -3,7 +3,7 @@ module Test.Main where import Prelude import Effect (Effect) -import Record (delete, equal, get, insert, merge, modify, rename, set) +import Record (delete, equal, get, insert, merge, modify, rename, set, (//)) import Record.Builder as Builder import Record.Unsafe (unsafeHas) import Test.Assert (assert') @@ -33,6 +33,8 @@ main = do not $ equal { a: 1, b: "b", c: true } { a: 1, b: "b", c: false } assert' "merge" $ equal { x: 1, y: "y" } (merge { y: "y" } { x: 1, y: 2 }) + assert' "mergeFlipped" $ + equal { x: 1, y: "y", z: true } ({ x: 1, y: 2 } // { y: "y" } // { z: true }) assert' "unsafeHas1" $ unsafeHas "a" { a: 42 } assert' "unsafeHas2" $ From 9726a3a548b76094f439fa925d9bdb88213eb240 Mon Sep 17 00:00:00 2001 From: sigma-andex <77549848+sigma-andex@users.noreply.github.com> Date: Thu, 9 Jun 2022 13:58:49 +0100 Subject: [PATCH 2/2] Minor fix in code comment --- src/Record.purs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Record.purs b/src/Record.purs index 4ac39d0..5fc9692 100644 --- a/src/Record.purs +++ b/src/Record.purs @@ -177,7 +177,7 @@ merge l r = runFn2 unsafeUnionFn l r -- | For example: -- | -- | ```purescript --- | merge { x: 1, y: "y" } { y: 2, z: true } +-- | mergeFlipped { x: 1, y: "y" } { y: 2, z: true } -- | :: { x :: Int, y :: Int, z :: Boolean } -- | ``` mergeFlipped