From be024166e5efc6433f77ad439ec7b492cba9ce5a Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Musso Date: Thu, 7 Nov 2019 11:59:15 +0100 Subject: [PATCH] Provide example on using Newtype and Maybe Newtype --- examples/Newtypes.purs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 examples/Newtypes.purs diff --git a/examples/Newtypes.purs b/examples/Newtypes.purs new file mode 100644 index 0000000..2435c00 --- /dev/null +++ b/examples/Newtypes.purs @@ -0,0 +1,37 @@ +module Example.Newtypes where + +import Prelude +import Control.Monad.Except (runExcept) +import Data.Maybe (Maybe) +import Data.Traversable (traverse) +import Effect (Effect) +import Effect.Console (logShow) +import Example.Util.Value (foreignValue) +import Foreign (F, Foreign, readNullOrUndefined, readString) +import Foreign.Index ((!)) + +newtype Email + = Email String + +derive newtype instance showEmail :: Show Email + +type SomeObject + = { foo :: String + , bar :: Maybe String + , baz :: Email + , duh :: Maybe Email + } + +readObject :: Foreign -> F SomeObject +readObject value = do + foo <- value ! "foo" >>= readString + bar <- value ! "bar" >>= readNullOrUndefined >>= traverse readString + baz <- value ! "baz" >>= readString <#> Email + duh <- value ! "duh" >>= readNullOrUndefined >>= traverse readString <#> map Email + pure { foo, bar, baz, duh } + +main :: Effect Unit +main = do + logShow $ runExcept + $ readObject + =<< foreignValue """{ "foo": "a@b.org", "bar": null, "baz": "c@d.net" }"""