Skip to content

Commit cfb3d65

Browse files
authored
Use null for mempty ReactElement (#187)
* Use null for mempty ReactElement * Update CHANGELOG
1 parent 6b91856 commit cfb3d65

File tree

4 files changed

+23
-4
lines changed

4 files changed

+23
-4
lines changed

Diff for: CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Notable changes to this project are documented in this file. The format is based
55
## [Unreleased]
66

77
Breaking changes:
8+
- Update the Monoid/Semigroup instance of `ReactElement` to use `null` for `mempty` instead of an empty fragment. (#187)
89

910
New features:
1011

Diff for: packages.dhall

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
let upstream =
2-
https://raw.githubusercontent.com/purescript/package-sets/prepare-0.15/src/packages.dhall
2+
https://github.com/purescript/package-sets/releases/download/psc-0.15.4-20221208/packages.dhall
3+
sha256:e3549e48d0170e14838d8f0c44172253947dcb6117b51a763f33dca34f00ba43
34

45
in upstream

Diff for: src/React.js

+8
Original file line numberDiff line numberDiff line change
@@ -153,3 +153,11 @@ function createContext(defaultValue) {
153153
};
154154
}
155155
export {createContext};
156+
157+
export var emptyReactElement = null;
158+
159+
function isEmptyReactElement(a) {
160+
return a === emptyReactElement;
161+
};
162+
163+
export {isEmptyReactElement};

Diff for: src/React.purs

+12-3
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,18 @@ type TagName = String
8181
-- | A virtual DOM node, or component.
8282
foreign import data ReactElement :: Type
8383

84+
foreign import emptyReactElement :: ReactElement
85+
86+
foreign import isEmptyReactElement :: ReactElement -> Boolean
87+
8488
instance semigroupReactElement :: Semigroup ReactElement where
85-
append a b = toElement [ a, b ]
89+
append a b
90+
| isEmptyReactElement a = b
91+
| isEmptyReactElement b = a
92+
| otherwise = toElement [ a, b ]
8693

8794
instance monoidReactElement :: Monoid ReactElement where
88-
mempty = toElement ([] :: Array ReactElement)
95+
mempty = emptyReactElement
8996

9097
-- | A mounted react component
9198
foreign import data ReactComponent :: Type
@@ -493,7 +500,9 @@ instance isReactElementReactElement :: IsReactElement ReactElement where
493500
toElement = identity
494501

495502
instance isReactElementArray :: IsReactElement (Array ReactElement) where
496-
toElement = createElement fragment {}
503+
toElement = case _ of
504+
[] -> mempty
505+
children -> createElement fragment {} children
497506

498507
-- | Creates a keyed fragment.
499508
fragmentWithKey :: String -> Array ReactElement -> ReactElement

0 commit comments

Comments
 (0)