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..5fc9692 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 +-- | mergeFlipped { 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" $