Skip to content

Commit f43b4af

Browse files
authored
Merge pull request #22 from justinwoo/nullorundefined-instances
add decode/encode instances for NullOrUndefined
2 parents ad0d657 + f54bca6 commit f43b4af

File tree

5 files changed

+31
-1
lines changed

5 files changed

+31
-1
lines changed

src/Data/Foreign/Class.purs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import Control.Monad.Except (mapExcept)
55
import Data.Array ((..), zipWith, length)
66
import Data.Bifunctor (lmap)
77
import Data.Foreign (F, Foreign, ForeignError(ErrorAtIndex), readArray, readBoolean, readChar, readInt, readNumber, readString, toForeign)
8+
import Data.Foreign.NullOrUndefined (NullOrUndefined(..), readNullOrUndefined, undefined)
9+
import Data.Maybe (maybe)
810
import Data.Traversable (sequence)
911

1012
-- | The `Decode` class is used to generate decoding functions
@@ -89,3 +91,9 @@ instance intEncode :: Encode Int where
8991

9092
instance arrayEncode :: Encode a => Encode (Array a) where
9193
encode = toForeign <<< map encode
94+
95+
instance decodeNullOrUndefined :: Decode a => Decode (NullOrUndefined a) where
96+
decode = readNullOrUndefined decode
97+
98+
instance encodeNullOrUndefined :: Encode a => Encode (NullOrUndefined a) where
99+
encode (NullOrUndefined a) = maybe undefined encode a
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
exports['undefined'] = undefined;

src/Data/Foreign/NullOrUndefined.purs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,5 @@ unNullOrUndefined (NullOrUndefined m) = m
2828
readNullOrUndefined :: forall a. (Foreign -> F a) -> Foreign -> F (NullOrUndefined a)
2929
readNullOrUndefined _ value | isNull value || isUndefined value = pure (NullOrUndefined Nothing)
3030
readNullOrUndefined f value = NullOrUndefined <<< Just <$> f value
31+
32+
foreign import undefined :: Foreign

test/Main.purs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import Data.Bifunctor (bimap)
88
import Data.Either (Either(..))
99
import Data.Foreign.Class (class Encode, class Decode)
1010
import Data.Foreign.Generic (decodeJSON, encodeJSON)
11+
import Data.Foreign.NullOrUndefined (NullOrUndefined(..))
12+
import Data.Maybe (Maybe(..))
1113
import Data.Tuple (Tuple(..))
1214
import Test.Assert (assert, assert', ASSERT)
13-
import Test.Types (IntList(..), RecordTest(..), Tree(..), TupleArray(..))
15+
import Test.Types (IntList(..), RecordTest(..), Tree(..), TupleArray(..), UndefinedTest(..))
1416

1517
buildTree :: forall a. (a -> TupleArray a a) -> Int -> a -> Tree a
1618
buildTree _ 0 a = Leaf a
@@ -44,5 +46,9 @@ main :: forall eff. Eff (console :: CONSOLE, assert :: ASSERT | eff) Unit
4446
main = do
4547
testRoundTrip (RecordTest { foo: 1, bar: "test", baz: 'a' })
4648
testRoundTrip (Cons 1 (Cons 2 (Cons 3 Nil)))
49+
testRoundTrip (UndefinedTest {a: NullOrUndefined (Just "test")})
50+
testRoundTrip (UndefinedTest {a: NullOrUndefined Nothing})
51+
testRoundTrip [NullOrUndefined (Just "test")]
52+
testRoundTrip [NullOrUndefined (Nothing :: Maybe String)]
4753
testRoundTrip (makeTree 0)
4854
testRoundTrip (makeTree 5)

test/Types.purs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import Data.Bifunctor (class Bifunctor)
55
import Data.Foreign (ForeignError(ForeignError), fail, readArray, toForeign)
66
import Data.Foreign.Class (class Encode, class Decode, encode, decode)
77
import Data.Foreign.Generic (defaultOptions, genericDecode, genericEncode)
8+
import Data.Foreign.NullOrUndefined (NullOrUndefined)
89
import Data.Generic.Rep (class Generic)
910
import Data.Generic.Rep.Eq (genericEq)
1011
import Data.Generic.Rep.Show (genericShow)
@@ -86,3 +87,15 @@ instance decodeTree :: Decode a => Decode (Tree a) where
8687

8788
instance encodeTree :: Encode a => Encode (Tree a) where
8889
encode x = genericEncode defaultOptions x
90+
91+
newtype UndefinedTest = UndefinedTest
92+
{ a :: NullOrUndefined String
93+
}
94+
95+
derive instance eqUT :: Eq UndefinedTest
96+
derive instance geUT :: Generic UndefinedTest _
97+
98+
instance dUT :: Decode UndefinedTest where
99+
decode = genericDecode $ defaultOptions
100+
instance eUT :: Encode UndefinedTest where
101+
encode = genericEncode $ defaultOptions

0 commit comments

Comments
 (0)