packages feed

purescript-bridge 0.14.0.0 → 0.15.0.0

raw patch · 11 files changed

+300/−78 lines, 11 filesnew-uploaderPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Language.PureScript.Bridge.CodeGenSwitches: purs_0_11_settings :: Settings
+ Language.PureScript.Bridge.CodeGenSwitches: [generateArgonautCodecs] :: Settings -> Bool
+ Language.PureScript.Bridge.CodeGenSwitches: [unwrapSingleArguments] :: ForeignOptions -> Bool
+ Language.PureScript.Bridge.CodeGenSwitches: genArgonautCodecs :: Switch
+ Language.PureScript.Bridge.CodeGenSwitches: noArgonautCodecs :: Switch
+ Language.PureScript.Bridge.PSTypes: psObject :: MonadReader BridgeData m => m PSType
+ Language.PureScript.Bridge.PSTypes: psWord :: PSType
+ Language.PureScript.Bridge.PSTypes: psWord16 :: PSType
+ Language.PureScript.Bridge.PSTypes: psWord32 :: PSType
+ Language.PureScript.Bridge.PSTypes: psWord64 :: PSType
+ Language.PureScript.Bridge.PSTypes: psWord8 :: PSType
+ Language.PureScript.Bridge.Primitives: strMapBridge :: BridgePart
+ Language.PureScript.Bridge.Primitives: word16Bridge :: BridgePart
+ Language.PureScript.Bridge.Primitives: word32Bridge :: BridgePart
+ Language.PureScript.Bridge.Primitives: word64Bridge :: BridgePart
+ Language.PureScript.Bridge.Primitives: word8Bridge :: BridgePart
+ Language.PureScript.Bridge.Primitives: wordBridge :: BridgePart
+ Language.PureScript.Bridge.Printer: [importAlias] :: ImportLine -> !Maybe Text
+ Language.PureScript.Bridge.Printer: _argonautCodecsImports :: Settings -> [ImportLine]
+ Language.PureScript.Bridge.Printer: decodeJsonFieldInstance :: PSType -> Text
+ Language.PureScript.Bridge.Printer: decodeJsonInstance :: PSType -> Text
+ Language.PureScript.Bridge.Printer: encodeJsonInstance :: PSType -> Text
+ Language.PureScript.Bridge.Printer: foreignOptionsToPurescript :: Maybe ForeignOptions -> Text
+ Language.PureScript.Bridge.SumType: DecodeJson :: Instance
+ Language.PureScript.Bridge.SumType: EncodeJson :: Instance
- Language.PureScript.Bridge: bridgeSumType :: FullBridge -> SumType 'Haskell -> SumType 'PureScript
+ Language.PureScript.Bridge: bridgeSumType :: FullBridge -> SumType 'Haskell -> SumType 'PureScript
- Language.PureScript.Bridge: writePSTypes :: FilePath -> FullBridge -> [SumType 'Haskell] -> IO ()
+ Language.PureScript.Bridge: writePSTypes :: FilePath -> FullBridge -> [SumType 'Haskell] -> IO ()
- Language.PureScript.Bridge: writePSTypesWith :: Switch -> FilePath -> FullBridge -> [SumType 'Haskell] -> IO ()
+ Language.PureScript.Bridge: writePSTypesWith :: Switch -> FilePath -> FullBridge -> [SumType 'Haskell] -> IO ()
- Language.PureScript.Bridge.CodeGenSwitches: ForeignOptions :: Bool -> ForeignOptions
+ Language.PureScript.Bridge.CodeGenSwitches: ForeignOptions :: Bool -> Bool -> ForeignOptions
- Language.PureScript.Bridge.CodeGenSwitches: Settings :: Bool -> Bool -> Maybe ForeignOptions -> Settings
+ Language.PureScript.Bridge.CodeGenSwitches: Settings :: Bool -> Bool -> Bool -> Maybe ForeignOptions -> Settings
- Language.PureScript.Bridge.Printer: ImportLine :: !Text -> !Set Text -> ImportLine
+ Language.PureScript.Bridge.Printer: ImportLine :: !Text -> !Maybe Text -> !Set Text -> ImportLine
- Language.PureScript.Bridge.Printer: PSModule :: !Text -> !Map Text ImportLine -> ![SumType lang] -> Module
+ Language.PureScript.Bridge.Printer: PSModule :: !Text -> !Map Text ImportLine -> ![SumType lang] -> Module (lang :: Language)
- Language.PureScript.Bridge.Printer: [psImportLines] :: Module -> !Map Text ImportLine
+ Language.PureScript.Bridge.Printer: [psImportLines] :: Module (lang :: Language) -> !Map Text ImportLine
- Language.PureScript.Bridge.Printer: [psModuleName] :: Module -> !Text
+ Language.PureScript.Bridge.Printer: [psModuleName] :: Module (lang :: Language) -> !Text
- Language.PureScript.Bridge.Printer: [psTypes] :: Module -> ![SumType lang]
+ Language.PureScript.Bridge.Printer: [psTypes] :: Module (lang :: Language) -> ![SumType lang]
- Language.PureScript.Bridge.Printer: constructorOptics :: SumType 'PureScript -> Text
+ Language.PureScript.Bridge.Printer: constructorOptics :: SumType 'PureScript -> Text
- Language.PureScript.Bridge.Printer: constructorToOptic :: Bool -> TypeInfo 'PureScript -> DataConstructor 'PureScript -> Text
+ Language.PureScript.Bridge.Printer: constructorToOptic :: Bool -> TypeInfo 'PureScript -> DataConstructor 'PureScript -> Text
- Language.PureScript.Bridge.Printer: constructorToText :: Int -> DataConstructor 'PureScript -> Text
+ Language.PureScript.Bridge.Printer: constructorToText :: Int -> DataConstructor 'PureScript -> Text
- Language.PureScript.Bridge.Printer: instances :: Settings -> SumType 'PureScript -> [Text]
+ Language.PureScript.Bridge.Printer: instances :: Settings -> SumType 'PureScript -> [Text]
- Language.PureScript.Bridge.Printer: mkFnArgs :: [RecordEntry 'PureScript] -> Text
+ Language.PureScript.Bridge.Printer: mkFnArgs :: [RecordEntry 'PureScript] -> Text
- Language.PureScript.Bridge.Printer: mkTypeSig :: [RecordEntry 'PureScript] -> Text
+ Language.PureScript.Bridge.Printer: mkTypeSig :: [RecordEntry 'PureScript] -> Text
- Language.PureScript.Bridge.Printer: moduleToText :: Settings -> Module 'PureScript -> Text
+ Language.PureScript.Bridge.Printer: moduleToText :: Settings -> Module 'PureScript -> Text
- Language.PureScript.Bridge.Printer: recordEntryToLens :: SumType 'PureScript -> RecordEntry 'PureScript -> Text
+ Language.PureScript.Bridge.Printer: recordEntryToLens :: SumType 'PureScript -> RecordEntry 'PureScript -> Text
- Language.PureScript.Bridge.Printer: recordEntryToText :: RecordEntry 'PureScript -> Text
+ Language.PureScript.Bridge.Printer: recordEntryToText :: RecordEntry 'PureScript -> Text
- Language.PureScript.Bridge.Printer: recordOptics :: SumType 'PureScript -> Text
+ Language.PureScript.Bridge.Printer: recordOptics :: SumType 'PureScript -> Text
- Language.PureScript.Bridge.Printer: sumTypeToModule :: SumType 'PureScript -> Modules -> Modules
+ Language.PureScript.Bridge.Printer: sumTypeToModule :: SumType 'PureScript -> Modules -> Modules
- Language.PureScript.Bridge.Printer: sumTypeToOptics :: SumType 'PureScript -> Text
+ Language.PureScript.Bridge.Printer: sumTypeToOptics :: SumType 'PureScript -> Text
- Language.PureScript.Bridge.Printer: sumTypeToText :: Settings -> SumType 'PureScript -> Text
+ Language.PureScript.Bridge.Printer: sumTypeToText :: Settings -> SumType 'PureScript -> Text
- Language.PureScript.Bridge.Printer: sumTypeToTypeDecls :: Settings -> SumType 'PureScript -> Text
+ Language.PureScript.Bridge.Printer: sumTypeToTypeDecls :: Settings -> SumType 'PureScript -> Text
- Language.PureScript.Bridge.Printer: sumTypesToModules :: Modules -> [SumType 'PureScript] -> Modules
+ Language.PureScript.Bridge.Printer: sumTypesToModules :: Modules -> [SumType 'PureScript] -> Modules
- Language.PureScript.Bridge.Printer: type PSModule = Module 'PureScript
+ Language.PureScript.Bridge.Printer: type PSModule = Module 'PureScript
- Language.PureScript.Bridge.Printer: typeNameAndForall :: TypeInfo 'PureScript -> (Text, Text)
+ Language.PureScript.Bridge.Printer: typeNameAndForall :: TypeInfo 'PureScript -> (Text, Text)
- Language.PureScript.Bridge.SumType: DataConstructor :: !Text -> !Either [TypeInfo lang] [RecordEntry lang] -> DataConstructor
+ Language.PureScript.Bridge.SumType: DataConstructor :: !Text -> !Either [TypeInfo lang] [RecordEntry lang] -> DataConstructor (lang :: Language)
- Language.PureScript.Bridge.SumType: RecordEntry :: !Text -> !TypeInfo lang -> RecordEntry
+ Language.PureScript.Bridge.SumType: RecordEntry :: !Text -> !TypeInfo lang -> RecordEntry (lang :: Language)
- Language.PureScript.Bridge.SumType: SumType :: TypeInfo lang -> [DataConstructor lang] -> [Instance] -> SumType
+ Language.PureScript.Bridge.SumType: SumType :: TypeInfo lang -> [DataConstructor lang] -> [Instance] -> SumType (lang :: Language)
- Language.PureScript.Bridge.SumType: [_recLabel] :: RecordEntry -> !Text
+ Language.PureScript.Bridge.SumType: [_recLabel] :: RecordEntry (lang :: Language) -> !Text
- Language.PureScript.Bridge.SumType: [_recValue] :: RecordEntry -> !TypeInfo lang
+ Language.PureScript.Bridge.SumType: [_recValue] :: RecordEntry (lang :: Language) -> !TypeInfo lang
- Language.PureScript.Bridge.SumType: [_sigConstructor] :: DataConstructor -> !Text
+ Language.PureScript.Bridge.SumType: [_sigConstructor] :: DataConstructor (lang :: Language) -> !Text
- Language.PureScript.Bridge.SumType: [_sigValues] :: DataConstructor -> !Either [TypeInfo lang] [RecordEntry lang]
+ Language.PureScript.Bridge.SumType: [_sigValues] :: DataConstructor (lang :: Language) -> !Either [TypeInfo lang] [RecordEntry lang]
- Language.PureScript.Bridge.SumType: mkSumType :: forall t. (Generic t, Typeable t, GDataConstructor (Rep t)) => Proxy t -> SumType 'Haskell
+ Language.PureScript.Bridge.SumType: mkSumType :: forall t. (Generic t, Typeable t, GDataConstructor (Rep t)) => Proxy t -> SumType 'Haskell
- Language.PureScript.Bridge.SumType: recLabel :: forall lang_aj2g. Lens' (RecordEntry lang_aj2g) Text
+ Language.PureScript.Bridge.SumType: recLabel :: forall lang_aaHT. Lens' (RecordEntry lang_aaHT) Text
- Language.PureScript.Bridge.SumType: recValue :: forall lang_aj2g lang_akXy. Lens (RecordEntry lang_aj2g) (RecordEntry lang_akXy) (TypeInfo lang_aj2g) (TypeInfo lang_akXy)
+ Language.PureScript.Bridge.SumType: recValue :: forall lang_aaHT lang_acJa. Lens (RecordEntry lang_aaHT) (RecordEntry lang_acJa) (TypeInfo lang_aaHT) (TypeInfo lang_acJa)
- Language.PureScript.Bridge.SumType: sigConstructor :: forall lang_aj2h. Lens' (DataConstructor lang_aj2h) Text
+ Language.PureScript.Bridge.SumType: sigConstructor :: forall lang_aaHU. Lens' (DataConstructor lang_aaHU) Text
- Language.PureScript.Bridge.SumType: sigValues :: forall lang_aj2h lang_akWh. Lens (DataConstructor lang_aj2h) (DataConstructor lang_akWh) (Either [TypeInfo lang_aj2h] [RecordEntry lang_aj2h]) (Either [TypeInfo lang_akWh] [RecordEntry lang_akWh])
+ Language.PureScript.Bridge.SumType: sigValues :: forall lang_aaHU lang_acHT. Lens (DataConstructor lang_aaHU) (DataConstructor lang_acHT) (Either [TypeInfo lang_aaHU] [RecordEntry lang_aaHU]) (Either [TypeInfo lang_acHT] [RecordEntry lang_acHT])
- Language.PureScript.Bridge.TypeInfo: TypeInfo :: !Text -> !Text -> !Text -> ![TypeInfo lang] -> TypeInfo
+ Language.PureScript.Bridge.TypeInfo: TypeInfo :: !Text -> !Text -> !Text -> ![TypeInfo lang] -> TypeInfo (lang :: Language)
- Language.PureScript.Bridge.TypeInfo: [_typeModule] :: TypeInfo -> !Text
+ Language.PureScript.Bridge.TypeInfo: [_typeModule] :: TypeInfo (lang :: Language) -> !Text
- Language.PureScript.Bridge.TypeInfo: [_typeName] :: TypeInfo -> !Text
+ Language.PureScript.Bridge.TypeInfo: [_typeName] :: TypeInfo (lang :: Language) -> !Text
- Language.PureScript.Bridge.TypeInfo: [_typePackage] :: TypeInfo -> !Text
+ Language.PureScript.Bridge.TypeInfo: [_typePackage] :: TypeInfo (lang :: Language) -> !Text
- Language.PureScript.Bridge.TypeInfo: [_typeParameters] :: TypeInfo -> ![TypeInfo lang]
+ Language.PureScript.Bridge.TypeInfo: [_typeParameters] :: TypeInfo (lang :: Language) -> ![TypeInfo lang]
- Language.PureScript.Bridge.TypeInfo: type HaskellType = TypeInfo 'Haskell
+ Language.PureScript.Bridge.TypeInfo: type HaskellType = TypeInfo 'Haskell
- Language.PureScript.Bridge.TypeInfo: type PSType = TypeInfo 'PureScript
+ Language.PureScript.Bridge.TypeInfo: type PSType = TypeInfo 'PureScript
- Language.PureScript.Bridge.TypeInfo: typeModule :: forall lang_a9PV. Lens' (TypeInfo lang_a9PV) Text
+ Language.PureScript.Bridge.TypeInfo: typeModule :: forall lang_a81b. Lens' (TypeInfo lang_a81b) Text
- Language.PureScript.Bridge.TypeInfo: typeName :: forall lang_a9PV. Lens' (TypeInfo lang_a9PV) Text
+ Language.PureScript.Bridge.TypeInfo: typeName :: forall lang_a81b. Lens' (TypeInfo lang_a81b) Text
- Language.PureScript.Bridge.TypeInfo: typePackage :: forall lang_a9PV. Lens' (TypeInfo lang_a9PV) Text
+ Language.PureScript.Bridge.TypeInfo: typePackage :: forall lang_a81b. Lens' (TypeInfo lang_a81b) Text
- Language.PureScript.Bridge.TypeInfo: typeParameters :: forall lang_a9PV lang_aczy. Lens (TypeInfo lang_a9PV) (TypeInfo lang_aczy) [TypeInfo lang_a9PV] [TypeInfo lang_aczy]
+ Language.PureScript.Bridge.TypeInfo: typeParameters :: forall lang_a81b lang_a9km. Lens (TypeInfo lang_a81b) (TypeInfo lang_a9km) [TypeInfo lang_a81b] [TypeInfo lang_a9km]

Files

README.md view
@@ -1,7 +1,7 @@ # purescript-bridge  -[![Build Status](https://travis-ci.org/eskimor/purescript-bridge.svg?branch=master)](https://travis-ci.org/eskimor/purescript-bridge)+[![Haskell library and example](https://github.com/eskimor/purescript-bridge/actions/workflows/haskell.yml/badge.svg)](https://github.com/eskimor/purescript-bridge/actions/workflows/haskell.yml) [![Purescript example](https://github.com/eskimor/purescript-bridge/actions/workflows/purescript.yml/badge.svg)](https://github.com/eskimor/purescript-bridge/actions/workflows/purescript.yml) [![Build Status](https://travis-ci.org/eskimor/purescript-bridge.svg?branch=master)](https://travis-ci.org/eskimor/purescript-bridge)   @@ -10,11 +10,18 @@  Data type translation is fully and easily customizable by providing your own `BridgePart` instances! +The latest version of this project requires **Purescript 0.15**.+ ## JSON encoding / decoding -For compatible JSON representations you should be using [aeson](http://hackage.haskell.org/package/aeson)'s generic encoding/decoding with default options-and `encodeJson` and `decodeJson` from "Data.Argonaut.Generic.Aeson" in [purescript-argonaut-generic-codecs](https://github.com/eskimor/purescript-argonaut-generic-codecs).+For compatible JSON representations: +* On Haskell side:+  * Use [`aeson`](http://hackage.haskell.org/package/aeson)'s generic encoding/decoding with default options+* On Purescript side:+  * Use [`purescript-argonaut-aeson-generic >=0.4.1`](https://pursuit.purescript.org/packages/purescript-argonaut-aeson-generic/0.4.1) ([GitHub](https://github.com/coot/purescript-argonaut-aeson-generic))+  * Or use [`purescript-foreign-generic`](https://pursuit.purescript.org/packages/purescript-foreign-generic).+    * [This branch](https://github.com/paf31/purescript-foreign-generic/pull/76) is updated for Purescript 0.15.  ## Documentation 
purescript-bridge.cabal view
@@ -10,7 +10,7 @@ -- PVP summary:      +-+------- breaking API changes --                   | | +----- non-breaking API additions --                   | | | +--- code changes with no API change-version:             0.14.0.0+version:             0.15.0.0  -- A short (one-line) description of the package. synopsis:            Generate PureScript data types from Haskell data types
src/Language/PureScript/Bridge.hs view
@@ -130,12 +130,18 @@     <|> listBridge     <|> maybeBridge     <|> eitherBridge+    <|> strMapBridge     <|> boolBridge     <|> intBridge     <|> doubleBridge     <|> tupleBridge     <|> unitBridge     <|> noContentBridge+    <|> wordBridge+    <|> word8Bridge+    <|> word16Bridge+    <|> word32Bridge+    <|> word64Bridge  -- | Translate types in a constructor. bridgeConstructor :: FullBridge -> DataConstructor 'Haskell -> DataConstructor 'PureScript
src/Language/PureScript/Bridge/Builder.hs view
@@ -43,6 +43,7 @@ import           Control.Monad.Trans.Reader          (Reader, ReaderT (..),                                                       runReader) import           Data.Maybe                          (fromMaybe)+import           Data.Monoid ((<>)) import qualified Data.Text                           as T import           Language.PureScript.Bridge.TypeInfo 
src/Language/PureScript/Bridge/CodeGenSwitches.hs view
@@ -3,13 +3,13 @@     ( Settings (..)     , ForeignOptions(..)     , defaultSettings-    , purs_0_11_settings     , Switch     , getSettings     , defaultSwitch     , noLenses, genLenses     , useGen, useGenRep-    , genForeign, noForeign+    , genForeign, noForeign, noArgonautCodecs+    , genArgonautCodecs     ) where  @@ -19,24 +19,20 @@ data Settings = Settings     { generateLenses :: Bool -- ^use purescript-profunctor-lens for generated PS-types?     , genericsGenRep :: Bool -- ^generate generics using purescript-generics-rep instead of purescript-generics+    , generateArgonautCodecs :: Bool -- ^generate Data.Argonaut.Decode.Class EncodeJson and DecodeJson instances     , generateForeign :: Maybe ForeignOptions -- ^generate Foreign.Generic Encode and Decode instances     }     deriving (Eq, Show)  data ForeignOptions = ForeignOptions     { unwrapSingleConstructors :: Bool+    , unwrapSingleArguments    :: Bool     }     deriving (Eq, Show)  -- | Settings to generate Lenses defaultSettings :: Settings-defaultSettings = Settings True True Nothing----- |settings for purescript 0.11.x-purs_0_11_settings :: Settings-purs_0_11_settings = Settings True False Nothing-+defaultSettings = Settings True True True Nothing  -- | you can `mappend` switches to control the code generation type Switch = Endo Settings@@ -56,6 +52,10 @@ noLenses :: Switch noLenses = Endo $ \settings -> settings { generateLenses = False } +-- | Switch off the generatation of argonaut-codecs+noArgonautCodecs :: Switch+noArgonautCodecs = Endo $ \settings ->+  settings { generateArgonautCodecs = False }  -- | Switch on the generatation of profunctor-lenses genLenses :: Switch@@ -73,6 +73,10 @@  genForeign :: ForeignOptions -> Switch genForeign opts = Endo $ \settings -> settings { generateForeign = Just opts }++genArgonautCodecs :: Switch+genArgonautCodecs = Endo $ \settings ->+  settings { generateArgonautCodecs = True }  noForeign :: Switch noForeign = Endo $ \settings -> settings { generateForeign = Nothing }
src/Language/PureScript/Bridge/PSTypes.hs view
@@ -31,6 +31,11 @@ psEither :: MonadReader BridgeData m => m PSType psEither = TypeInfo "purescript-either" "Data.Either" "Either" <$> psTypeParameters +psObject :: MonadReader BridgeData m => m PSType+psObject = do+  valueTypes <- tail <$> psTypeParameters+  return $ TypeInfo "purescript-foreign-object" "Foreign.Object" "Object" valueTypes+ psInt :: PSType psInt = TypeInfo {     _typePackage = ""@@ -73,5 +78,45 @@     _typePackage = "purescript-prelude"   , _typeModule = "Prelude"   , _typeName = "Unit"+  , _typeParameters = []+  }++psWord :: PSType+psWord = TypeInfo  {+    _typePackage = "purescript-word"+  , _typeModule = "Data.Word"+  , _typeName = "Word"+  , _typeParameters = []+  }++psWord8 :: PSType+psWord8 = TypeInfo  {+    _typePackage = "purescript-word"+  , _typeModule = "Data.Word"+  , _typeName = "Word8"+  , _typeParameters = []+  }++psWord16 :: PSType+psWord16 = TypeInfo  {+    _typePackage = "purescript-word"+  , _typeModule = "Data.Word"+  , _typeName = "Word16"+  , _typeParameters = []+  }++psWord32 :: PSType+psWord32 = TypeInfo  {+    _typePackage = "purescript-word"+  , _typeModule = "Data.Word"+  , _typeName = "Word32"+  , _typeParameters = []+  }++psWord64 :: PSType+psWord64 = TypeInfo  {+    _typePackage = "purescript-word"+  , _typeModule = "Data.Word"+  , _typeName = "Word64"   , _typeParameters = []   }
src/Language/PureScript/Bridge/Primitives.hs view
@@ -19,6 +19,9 @@ eitherBridge :: BridgePart eitherBridge = typeName ^== "Either" >> psEither +strMapBridge :: BridgePart+strMapBridge = typeName ^== "Map" >> psObject+ -- | Dummy bridge, translates every type with 'clearPackageFixUp' dummyBridge :: MonadReader BridgeData m => m PSType dummyBridge = clearPackageFixUp@@ -49,3 +52,18 @@  noContentBridge :: BridgePart noContentBridge = typeName ^== "NoContent" >> return psUnit++wordBridge :: BridgePart+wordBridge = typeName ^== "Word" >> return psWord++word8Bridge :: BridgePart+word8Bridge = typeName ^== "Word8" >> return psWord8++word16Bridge :: BridgePart+word16Bridge = typeName ^== "Word16" >> return psWord16++word32Bridge :: BridgePart+word32Bridge = typeName ^== "Word32" >> return psWord32++word64Bridge :: BridgePart+word64Bridge = typeName ^== "Word64" >> return psWord64
src/Language/PureScript/Bridge/Printer.hs view
@@ -1,6 +1,8 @@ {-# LANGUAGE DataKinds         #-} {-# LANGUAGE KindSignatures    #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards   #-}+{-# LANGUAGE LambdaCase        #-}  module Language.PureScript.Bridge.Printer where @@ -8,6 +10,7 @@ import           Control.Monad import           Data.Map.Strict (Map) import qualified Data.Map.Strict as Map+import           Data.Monoid ((<>)) import           Data.Set (Set) import           Data.Maybe (isJust) import qualified Data.Set as Set@@ -17,7 +20,6 @@ import           System.Directory import           System.FilePath - import           Language.PureScript.Bridge.SumType import           Language.PureScript.Bridge.TypeInfo import qualified Language.PureScript.Bridge.CodeGenSwitches as Switches@@ -33,6 +35,7 @@  data ImportLine = ImportLine {   importModule :: !Text+, importAlias  :: !(Maybe Text) , importTypes  :: !(Set Text) } deriving Show @@ -66,45 +69,63 @@      ]   <> map (sumTypeToText settings) (psTypes m)   where-    otherImports = importsFromList (_lensImports settings <> _genericsImports settings <> _foreignImports settings)+    otherImports = importsFromList $+      _lensImports settings+      <> _genericsImports settings+      <> _argonautCodecsImports settings+      <> _foreignImports settings     allImports = Map.elems $ mergeImportLines otherImports (psImportLines m) - _genericsImports :: Switches.Settings -> [ImportLine] _genericsImports settings   | Switches.genericsGenRep settings =-     [ ImportLine "Data.Generic.Rep" $ Set.fromList ["class Generic"] ]+     [ ImportLine "Data.Generic.Rep" Nothing $ Set.fromList ["class Generic"] ]   | otherwise =-    [ ImportLine "Data.Generic" $ Set.fromList ["class Generic"] ]-+    [ ImportLine "Data.Generic" Nothing $ Set.fromList ["class Generic"] ]  _lensImports :: Switches.Settings -> [ImportLine] _lensImports settings   | Switches.generateLenses settings =-    [ ImportLine "Data.Maybe" $ Set.fromList ["Maybe(..)"]-    , ImportLine "Data.Lens" $ Set.fromList ["Iso'", "Prism'", "Lens'", "prism'", "lens"]-    , ImportLine "Data.Lens.Record" $ Set.fromList ["prop"]-    , ImportLine "Data.Lens.Iso.Newtype" $ Set.fromList ["_Newtype"]-    , ImportLine "Data.Symbol" $ Set.fromList ["SProxy(SProxy)"]-    , ImportLine "Data.Newtype" $ Set.fromList ["class Newtype"]+    [ ImportLine "Data.Lens" Nothing $ Set.fromList ["Iso'", "Prism'", "Lens'", "prism'", "lens"]+    , ImportLine "Data.Lens.Iso.Newtype" Nothing $ Set.fromList ["_Newtype"]+    , ImportLine "Data.Lens.Record" Nothing $ Set.fromList ["prop"]+    ] <> baseline <>+    [ ImportLine "Type.Proxy" Nothing $ Set.fromList ["Proxy(Proxy)"]     ]-  | otherwise =-    [ ImportLine "Data.Maybe" $ Set.fromList ["Maybe(..)"]-    , ImportLine "Data.Newtype" $ Set.fromList ["class Newtype"]+  | otherwise = baseline+  where+    baseline =+      [ ImportLine "Data.Maybe" Nothing $ Set.fromList ["Maybe(..)"]+      , ImportLine "Data.Newtype" Nothing $ Set.fromList ["class Newtype"]+      ]++_argonautCodecsImports :: Switches.Settings -> [ImportLine]+_argonautCodecsImports settings+  | Switches.generateArgonautCodecs settings =+    [ ImportLine "Data.Argonaut.Aeson.Decode.Generic" Nothing $ Set.fromList [ "genericDecodeAeson" ]+    , ImportLine "Data.Argonaut.Aeson.Encode.Generic" Nothing $ Set.fromList [ "genericEncodeAeson" ]+    , ImportLine "Data.Argonaut.Aeson.Options" (Just "Argonaut") $ Set.fromList [ "defaultOptions" ]+    , ImportLine "Data.Argonaut.Decode.Class" Nothing $ Set.fromList [ "class DecodeJson", "class DecodeJsonField", "decodeJson" ]+    , ImportLine "Data.Argonaut.Encode.Class" Nothing $ Set.fromList [ "class EncodeJson", "encodeJson" ]     ]+  | otherwise = mempty  _foreignImports :: Switches.Settings -> [ImportLine] _foreignImports settings   | (isJust . Switches.generateForeign) settings = -      [ ImportLine "Foreign.Generic" $ Set.fromList ["defaultOptions", "genericDecode", "genericEncode"]-      , ImportLine "Foreign.Class" $ Set.fromList ["class Decode", "class Encode"]+      [ ImportLine "Foreign.Class" Nothing $ Set.fromList ["class Decode", "class Encode"]+      , ImportLine "Foreign.Generic" Nothing $ Set.fromList ["defaultOptions", "genericDecode", "genericEncode"]       ]-  | otherwise = []+  | otherwise = mempty  importLineToText :: ImportLine -> Text-importLineToText l = "import " <> importModule l <> " (" <> typeList <> ")"+importLineToText = \case+  ImportLine importModule Nothing importTypes ->+    "import " <> importModule <> " (" <> typeList importTypes <> ")"+  ImportLine importModule (Just importAlias) _ ->+    "import " <> importModule <> " as " <> importAlias   where-    typeList = T.intercalate ", " (Set.toList (importTypes l))+    typeList s = T.intercalate ", " (Set.toList s)  sumTypeToText :: Switches.Settings -> SumType 'PureScript -> Text sumTypeToText settings st =@@ -119,13 +140,35 @@ sumTypeToTypeDecls settings (SumType t cs is) = T.unlines $     dataOrNewtype <> " " <> typeInfoToText True t <> " ="   : "    " <> T.intercalate "\n  | " (map (constructorToText 4) cs) <> "\n"-  : instances settings (SumType t cs (filter genForeign is))+  : instances settings (SumType t cs (filter genForeign . filter genArgonautCodec $ is))   where     dataOrNewtype = if isJust (nootype cs) then "newtype" else "data"-    genForeign Encode = (isJust . Switches.generateForeign) settings-    genForeign Decode = (isJust . Switches.generateForeign) settings-    genForeign _ = True+    genForeign :: Instance -> Bool+    genForeign = \case+      Encode -> check+      Decode -> check+      _      -> True+      where check = (isJust . Switches.generateForeign) settings +    genArgonautCodec :: Instance -> Bool+    genArgonautCodec = \case+      EncodeJson -> check+      DecodeJson -> check+      _          -> True+      where check = Switches.generateArgonautCodecs settings++foreignOptionsToPurescript :: Maybe Switches.ForeignOptions -> Text+foreignOptionsToPurescript = \case+  Nothing -> mempty+  Just (Switches.ForeignOptions{..}) ->+    " { unwrapSingleConstructors = "+    <> (T.toLower . T.pack . show $ unwrapSingleConstructors)+    <> " , unwrapSingleArguments = "+    <> (T.toLower . T.pack . show $ unwrapSingleArguments)+    <> " }"+++ -- | Given a Purescript type, generate instances for typeclass -- instances it claims to have. instances :: Switches.Settings -> SumType 'PureScript -> [Text]@@ -135,9 +178,8 @@     go Encode = "instance encode" <> _typeName t <> " :: " <> extras <> "Encode " <> typeInfoToText False t <> " where\n" <>                 "  encode = genericEncode $ defaultOptions" <> encodeOpts       where-        encodeOpts = case Switches.generateForeign settings of-                      Nothing -> ""-                      Just fopts -> " { unwrapSingleConstructors = " <> (T.toLower . T.pack . show . Switches.unwrapSingleConstructors) fopts <> " }"+        encodeOpts =+          foreignOptionsToPurescript $ Switches.generateForeign settings         stpLength = length sumTypeParameters         extras | stpLength == 0 = mempty                | otherwise = bracketWrap constraintsInner <> " => "@@ -145,12 +187,23 @@         constraintsInner = T.intercalate ", " $ map instances sumTypeParameters         instances params = genericInstance settings params <> ", " <> encodeInstance params         bracketWrap x = "(" <> x <> ")"+    go EncodeJson = "instance encodeJson" <> _typeName t <> " :: " <> extras <> "EncodeJson " <> typeInfoToText False t <> " where\n" <>+                "  encodeJson = genericEncodeAeson Argonaut.defaultOptions"+      where+        encodeOpts =+          foreignOptionsToPurescript $ Switches.generateForeign settings+        stpLength = length sumTypeParameters+        extras | stpLength == 0 = mempty+               | otherwise = bracketWrap constraintsInner <> " => "+        sumTypeParameters = filter (isTypeParam t) . Set.toList $ getUsedTypes st+        constraintsInner = T.intercalate ", " $ map instances sumTypeParameters+        instances params = genericInstance settings params <> ", " <> encodeJsonInstance params+        bracketWrap x = "(" <> x <> ")"     go Decode = "instance decode" <> _typeName t <> " :: " <> extras <> "Decode " <> typeInfoToText False t <> " where\n" <>                 "  decode = genericDecode $ defaultOptions" <> decodeOpts       where-        decodeOpts = case Switches.generateForeign settings of-                      Nothing -> ""-                      Just fopts -> " { unwrapSingleConstructors = " <> (T.toLower . T.pack . show . Switches.unwrapSingleConstructors) fopts <> " }"+        decodeOpts =+          foreignOptionsToPurescript $ Switches.generateForeign settings         stpLength = length sumTypeParameters         extras | stpLength == 0 = mempty                | otherwise = bracketWrap constraintsInner <> " => "@@ -158,6 +211,16 @@         constraintsInner = T.intercalate ", " $ map instances sumTypeParameters         instances params = genericInstance settings params <> ", " <> decodeInstance params         bracketWrap x = "(" <> x <> ")"+    go DecodeJson = "instance decodeJson" <> _typeName t <> " :: " <> extras <> "DecodeJson " <> typeInfoToText False t <> " where\n" <>+                "  decodeJson = genericDecodeAeson Argonaut.defaultOptions"+      where+        stpLength = length sumTypeParameters+        extras | stpLength == 0 = mempty+               | otherwise = bracketWrap constraintsInner <> " => "+        sumTypeParameters = filter (isTypeParam t) . Set.toList $ getUsedTypes st+        constraintsInner = T.intercalate ", " $ map instances sumTypeParameters+        instances params = genericInstance settings params <> ", " <> decodeJsonInstance params <> ", " <> decodeJsonFieldInstance params+        bracketWrap x = "(" <> x <> ")"     go i = "derive instance " <> T.toLower c <> _typeName t <> " :: " <> extras i <> c <> " " <> typeInfoToText False t <> postfix i       where c = T.pack $ show i             extras Generic | stpLength == 0 = mempty@@ -180,9 +243,18 @@ encodeInstance :: PSType -> Text encodeInstance params = "Encode " <> typeInfoToText False params +encodeJsonInstance :: PSType -> Text+encodeJsonInstance params = "EncodeJson " <> typeInfoToText False params+ decodeInstance :: PSType -> Text decodeInstance params = "Decode " <> typeInfoToText False params +decodeJsonInstance :: PSType -> Text+decodeJsonInstance params = "DecodeJson " <> typeInfoToText False params++decodeJsonFieldInstance :: PSType -> Text+decodeJsonFieldInstance params = "DecodeJsonField " <> typeInfoToText False params+ genericInstance :: Switches.Settings -> PSType -> Text genericInstance settings params =   if not (Switches.genericsGenRep settings) then@@ -227,7 +299,6 @@ spaces :: Int -> Text spaces c = T.replicate c " " - typeNameAndForall :: TypeInfo 'PureScript -> (Text, Text) typeNameAndForall typeInfo = (typName, forAll)   where@@ -297,7 +368,7 @@ recordEntryToLens st e =   if hasUnderscore   then lensName <> forAll <>  "Lens' " <> typName <> " " <> recType <> "\n"-      <> lensName <> " = _Newtype <<< prop (SProxy :: SProxy \"" <> recName <> "\")\n"+      <> lensName <> " = _Newtype <<< prop (Proxy :: Proxy \"" <> recName <> "\")\n"   else ""   where     (typName, forAll) = typeNameAndForall (st ^. sumTypeInfo)@@ -356,20 +427,21 @@                 then Map.alter (Just . updateLine) (_typeModule t)                 else id -    updateLine Nothing = ImportLine (_typeModule t) (Set.singleton (_typeName t))-    updateLine (Just (ImportLine m types)) = ImportLine m $ Set.insert (_typeName t) types+    updateLine Nothing = ImportLine (_typeModule t) Nothing (Set.singleton (_typeName t))+    updateLine (Just (ImportLine m alias types)) =+      ImportLine m alias (Set.insert (_typeName t) types)  importsFromList :: [ImportLine] -> Map Text ImportLine importsFromList ls = let     pairs = zip (map importModule ls) ls-    merge a b = ImportLine (importModule a) (importTypes a `Set.union` importTypes b)+    merge a b = ImportLine (importModule a) (importAlias a) (importTypes a `Set.union` importTypes b)   in     Map.fromListWith merge pairs  mergeImportLines :: ImportLines -> ImportLines -> ImportLines mergeImportLines = Map.unionWith mergeLines   where-    mergeLines a b = ImportLine (importModule a) (importTypes a `Set.union` importTypes b)+    mergeLines a b = ImportLine (importModule a) (importAlias a) (importTypes a `Set.union` importTypes b)  unlessM :: Monad m => m Bool -> m () -> m () unlessM mbool action = mbool >>= flip unless action
src/Language/PureScript/Bridge/SumType.hs view
@@ -55,12 +55,12 @@ --   In order to get the type information we use a dummy variable of type 'Proxy' (YourType). mkSumType :: forall t. (Generic t, Typeable t, GDataConstructor (Rep t))           => Proxy t -> SumType 'Haskell-mkSumType p = SumType (mkTypeInfo p) constructors (Encode : Decode : Generic : maybeToList (nootype constructors))+mkSumType p = SumType (mkTypeInfo p) constructors (Encode : Decode : EncodeJson : DecodeJson : Generic : maybeToList (nootype constructors))   where     constructors = gToConstructors (from (undefined :: t))  -- | Purescript typeclass instances that can be generated for your Haskell types.-data Instance = Encode | Decode | Generic | Newtype | Eq | Ord deriving (Eq, Show)+data Instance = Encode | EncodeJson | Decode | DecodeJson | Generic | Newtype | Eq | Ord deriving (Eq, Show)  -- | The Purescript typeclass `Newtype` might be derivable if the original -- Haskell type was a simple type wrapper.@@ -85,7 +85,6 @@                   , _sigValues      :: !(Either [TypeInfo lang] [RecordEntry lang])                   } deriving (Show, Eq) - data RecordEntry (lang :: Language) =   RecordEntry { _recLabel :: !Text -- ^ e.g. `runState` for `State`               , _recValue :: !(TypeInfo lang)@@ -117,7 +116,6 @@ instance (GRecordEntry a, GRecordEntry b) => GRecordEntry (a :*: b) where   gToRecordEntries (_ :: (a :*: b) f) = gToRecordEntries (undefined :: a f)                                      ++ gToRecordEntries (undefined :: b f)-  instance GRecordEntry U1 where   gToRecordEntries _ = []
test/Spec.hs view
@@ -4,6 +4,7 @@ {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings     #-} {-# LANGUAGE RankNTypes            #-}+{-# LANGUAGE TypeApplications      #-} {-# LANGUAGE TypeSynonymInstances  #-}  module Main where@@ -11,6 +12,7 @@ import           Data.Monoid                               ((<>)) import           Data.Proxy import qualified Data.Text                                 as T+import           Data.Word                                 (Word, Word64) import           Language.PureScript.Bridge import           Language.PureScript.Bridge.TypeParameters import           Language.PureScript.Bridge.CodeGenSwitches@@ -25,8 +27,7 @@  allTests :: Spec allTests = do-  describe "buildBridge for purescript 0.12" $ do-    let settings = purs_0_11_settings+  describe "buildBridge for purescript 0.14" $ do     it "tests with Int" $       let bst = buildBridge defaultBridge (mkTypeInfo (Proxy :: Proxy Int))           ti  = TypeInfo { _typePackage    = ""@@ -51,12 +52,12 @@                                       ]                   }                 ]-                [Eq, Ord, Encode, Decode, Generic]+                [Eq, Ord, Encode, Decode, EncodeJson, DecodeJson, Generic]        in bst `shouldBe` st     it "tests generation of for custom type Foo" $      let prox = Proxy :: Proxy Foo          recType = bridgeSumType (buildBridge defaultBridge) (order prox $ mkSumType prox)-         recTypeText = sumTypeToText settings recType+         recTypeText = sumTypeToText defaultSettings recType          txt = T.stripEnd $                T.unlines [ "data Foo ="                          , "    Foo"@@ -65,7 +66,11 @@                          , ""                          , "derive instance eqFoo :: Eq Foo"                          , "derive instance ordFoo :: Ord Foo"-                         , "derive instance genericFoo :: Generic Foo"+                         , "instance encodeJsonFoo :: EncodeJson Foo where"+                         , "  encodeJson = genericEncodeAeson Argonaut.defaultOptions"+                         , "instance decodeJsonFoo :: DecodeJson Foo where"+                         , "  decodeJson = genericDecodeAeson Argonaut.defaultOptions"+                         , "derive instance genericFoo :: Generic Foo _"                          , ""                          , "--------------------------------------------------------------------------------"                          , "_Foo :: Prism' Foo Unit"@@ -92,18 +97,23 @@     it "tests the generation of a whole (dummy) module" $       let advanced = bridgeSumType (buildBridge defaultBridge) (mkSumType (Proxy :: Proxy (Bar A B M1 C)))           modules = sumTypeToModule advanced Map.empty-          m = head . map (moduleToText settings) . Map.elems $ modules+          m = head . map (moduleToText defaultSettings) . Map.elems $ modules           txt = T.unlines [ "-- File auto generated by purescript-bridge! --"                           , "module TestData where"                           , ""+                          , "import Data.Argonaut.Aeson.Decode.Generic (genericDecodeAeson)"+                          , "import Data.Argonaut.Aeson.Encode.Generic (genericEncodeAeson)"+                          , "import Data.Argonaut.Aeson.Options as Argonaut"+                          , "import Data.Argonaut.Decode.Class (class DecodeJson, class DecodeJsonField, decodeJson)"+                          , "import Data.Argonaut.Encode.Class (class EncodeJson, encodeJson)"                           , "import Data.Either (Either)"-                          , "import Data.Generic (class Generic)"+                          , "import Data.Generic.Rep (class Generic)"                           , "import Data.Lens (Iso', Lens', Prism', lens, prism')"                           , "import Data.Lens.Iso.Newtype (_Newtype)"                           , "import Data.Lens.Record (prop)"                           , "import Data.Maybe (Maybe, Maybe(..))"                           , "import Data.Newtype (class Newtype)"-                          , "import Data.Symbol (SProxy(SProxy))"+                          , "import Type.Proxy (Proxy(Proxy))"                           , ""                           , "import Prelude"                           , ""@@ -115,7 +125,11 @@                           , "      myMonadicResult :: m b"                           , "    }"                           , ""-                          , "derive instance genericBar :: (Generic a, Generic b, Generic (m b)) => Generic (Bar a b m c)"+                          , "instance encodeJsonBar :: (Generic a ra, EncodeJson a, Generic b rb, EncodeJson b, Generic (m b) rmb, EncodeJson (m b)) => EncodeJson (Bar a b m c) where"+                          , "  encodeJson = genericEncodeAeson Argonaut.defaultOptions"+                          , "instance decodeJsonBar :: (Generic a ra, DecodeJson a, DecodeJsonField a, Generic b rb, DecodeJson b, DecodeJsonField b, Generic (m b) rmb, DecodeJson (m b), DecodeJsonField (m b)) => DecodeJson (Bar a b m c) where"+                          , "  decodeJson = genericDecodeAeson Argonaut.defaultOptions"+                          , "derive instance genericBar :: (Generic a ra, Generic b rb, Generic (m b) rmb) => Generic (Bar a b m c) _"                           , ""                           , "--------------------------------------------------------------------------------"                           , "_Bar1 :: forall a b m c. Prism' (Bar a b m c) (Maybe a)"@@ -202,16 +216,16 @@           recTypeOptics = recordOptics recType           txt = T.unlines [                             "a :: forall a b. Lens' (SingleRecord a b) a"-                          , "a = _Newtype <<< prop (SProxy :: SProxy \"_a\")"+                          , "a = _Newtype <<< prop (Proxy :: Proxy \"_a\")"                           , ""                           , "b :: forall a b. Lens' (SingleRecord a b) b"-                          , "b = _Newtype <<< prop (SProxy :: SProxy \"_b\")"+                          , "b = _Newtype <<< prop (Proxy :: Proxy \"_b\")"                           , ""                           ]       in (barOptics <> recTypeOptics) `shouldBe` txt     it "tests generation of newtypes for record data type" $       let recType = bridgeSumType (buildBridge defaultBridge) (mkSumType (Proxy :: Proxy (SingleRecord A B)))-          recTypeText = sumTypeToText settings recType+          recTypeText = sumTypeToText defaultSettings recType           txt = T.stripEnd $                 T.unlines [ "newtype SingleRecord a b ="                           , "    SingleRecord {"@@ -220,7 +234,11 @@                           , "    , c :: String"                           , "    }"                           , ""-                          , "derive instance genericSingleRecord :: (Generic a, Generic b) => Generic (SingleRecord a b)"+                          , "instance encodeJsonSingleRecord :: (Generic a ra, EncodeJson a, Generic b rb, EncodeJson b) => EncodeJson (SingleRecord a b) where"+                          , "  encodeJson = genericEncodeAeson Argonaut.defaultOptions"+                          , "instance decodeJsonSingleRecord :: (Generic a ra, DecodeJson a, DecodeJsonField a, Generic b rb, DecodeJson b, DecodeJsonField b) => DecodeJson (SingleRecord a b) where"+                          , "  decodeJson = genericDecodeAeson Argonaut.defaultOptions"+                          , "derive instance genericSingleRecord :: (Generic a ra, Generic b rb) => Generic (SingleRecord a b) _"                           , "derive instance newtypeSingleRecord :: Newtype (SingleRecord a b) _"                           , ""                           , "--------------------------------------------------------------------------------"@@ -228,22 +246,26 @@                           , "_SingleRecord = _Newtype"                           ,""                           , "a :: forall a b. Lens' (SingleRecord a b) a"-                          , "a = _Newtype <<< prop (SProxy :: SProxy \"_a\")"+                          , "a = _Newtype <<< prop (Proxy :: Proxy \"_a\")"                           , ""                           , "b :: forall a b. Lens' (SingleRecord a b) b"-                          , "b = _Newtype <<< prop (SProxy :: SProxy \"_b\")"+                          , "b = _Newtype <<< prop (Proxy :: Proxy \"_b\")"                           , ""                           , "--------------------------------------------------------------------------------"                           ]       in recTypeText `shouldBe` txt     it "tests generation of newtypes for haskell newtype" $       let recType = bridgeSumType (buildBridge defaultBridge) (mkSumType (Proxy :: Proxy SomeNewtype))-          recTypeText = sumTypeToText settings recType+          recTypeText = sumTypeToText defaultSettings recType           txt = T.stripEnd $                 T.unlines [ "newtype SomeNewtype ="                           , "    SomeNewtype Int"                           , ""-                          , "derive instance genericSomeNewtype :: Generic SomeNewtype"+                          , "instance encodeJsonSomeNewtype :: EncodeJson SomeNewtype where"+                          , "  encodeJson = genericEncodeAeson Argonaut.defaultOptions"+                          , "instance decodeJsonSomeNewtype :: DecodeJson SomeNewtype where"+                          , "  decodeJson = genericDecodeAeson Argonaut.defaultOptions"+                          , "derive instance genericSomeNewtype :: Generic SomeNewtype _"                           , "derive instance newtypeSomeNewtype :: Newtype SomeNewtype _"                           , ""                           , "--------------------------------------------------------------------------------"@@ -254,12 +276,16 @@       in recTypeText `shouldBe` txt     it "tests generation of newtypes for haskell data type with one argument" $       let recType = bridgeSumType (buildBridge defaultBridge) (mkSumType (Proxy :: Proxy SingleValueConstr))-          recTypeText = sumTypeToText settings recType+          recTypeText = sumTypeToText defaultSettings recType           txt = T.stripEnd $                 T.unlines [ "newtype SingleValueConstr ="                           , "    SingleValueConstr Int"                           , ""-                          , "derive instance genericSingleValueConstr :: Generic SingleValueConstr"+                          , "instance encodeJsonSingleValueConstr :: EncodeJson SingleValueConstr where"+                          , "  encodeJson = genericEncodeAeson Argonaut.defaultOptions"+                          , "instance decodeJsonSingleValueConstr :: DecodeJson SingleValueConstr where"+                          , "  decodeJson = genericDecodeAeson Argonaut.defaultOptions"+                          , "derive instance genericSingleValueConstr :: Generic SingleValueConstr _"                           , "derive instance newtypeSingleValueConstr :: Newtype SingleValueConstr _"                           , ""                           , "--------------------------------------------------------------------------------"@@ -270,12 +296,16 @@       in recTypeText `shouldBe` txt     it "tests generation for haskell data type with one constructor, two arguments" $       let recType = bridgeSumType (buildBridge defaultBridge) (mkSumType (Proxy :: Proxy SingleProduct))-          recTypeText = sumTypeToText settings recType+          recTypeText = sumTypeToText defaultSettings recType           txt = T.stripEnd $                 T.unlines [ "data SingleProduct ="                           , "    SingleProduct String Int"                           , ""-                          , "derive instance genericSingleProduct :: Generic SingleProduct"+                          , "instance encodeJsonSingleProduct :: EncodeJson SingleProduct where"+                          , "  encodeJson = genericEncodeAeson Argonaut.defaultOptions"+                          , "instance decodeJsonSingleProduct :: DecodeJson SingleProduct where"+                          , "  decodeJson = genericDecodeAeson Argonaut.defaultOptions"+                          , "derive instance genericSingleProduct :: Generic SingleProduct _"                           , ""                           , "--------------------------------------------------------------------------------"                           , "_SingleProduct :: Prism' SingleProduct { a :: String, b :: Int }"@@ -291,8 +321,8 @@           recTypeOptics = recordOptics recType       in recTypeOptics `shouldBe` "" -- No record optics for multi-constructors -  describe "buildBridge without lens-code-gen for purescript 0.11" $ do-    let settings = getSettings (noLenses <> useGen)+  describe "buildBridge without lens-code-gen and argonaut-codecs" $ do+    let settings = getSettings (noLenses <> useGen <> noArgonautCodecs)     it "tests generation of for custom type Foo" $       let proxy = Proxy :: Proxy Foo           recType = bridgeSumType (buildBridge defaultBridge) (order proxy $ mkSumType proxy)@@ -378,8 +408,8 @@       in recTypeText `shouldBe` txt  -  describe "buildBridge without lens-code-gen and generics-rep" $ do-    let settings = getSettings (noLenses <> useGenRep)+  describe "buildBridge without lens-code-gen, generics-rep, and argonaut-codecs" $ do+    let settings = getSettings (noLenses <> useGenRep <> noArgonautCodecs)     it "tests generation of for custom type Foo" $       let proxy = Proxy :: Proxy Foo           recType = bridgeSumType (buildBridge defaultBridge) (order proxy $ mkSumType proxy)@@ -464,3 +494,42 @@                           ]       in recTypeText `shouldBe` txt  +  describe "tests bridging Haskells Data.Word to PureScripts Data.Word from purescript-word" $ do+    describe "moduleToText" $+      it "should contain the right import and datatype" $ do+        let settings = getSettings (noLenses <> useGen <> noArgonautCodecs)+            createModuleText :: SumType 'Haskell -> T.Text+            createModuleText sumType =+              let bridge = buildBridge defaultBridge+                  modules = sumTypeToModule (bridgeSumType bridge sumType) Map.empty+               in head . map (moduleToText settings) . Map.elems $ modules+            expectedText =+              T.unlines+                [ "-- File auto generated by purescript-bridge! --"+                , "module TestData where"+                , ""+                , "import Data.Generic (class Generic)"+                , "import Data.Maybe (Maybe(..))"+                , "import Data.Newtype (class Newtype)"+                , "import Data.Word (Word64)"+                , ""+                , "import Prelude"+                , ""+                , "newtype Simple Word64 ="+                , "    Simple Word64"+                , ""+                , "derive instance genericSimple :: Generic Word64 => Generic (Simple Word64)"+                , "derive instance newtypeSimple :: Newtype (Simple Word64) _"+                , ""+                ]+        createModuleText (mkSumType (Proxy @(Simple Word64))) `shouldBe`  expectedText+    describe "buildBridge" $+      it "should create the correct type information for Word" $ do+        let bst = buildBridge defaultBridge (mkTypeInfo (Proxy @Word))+            ti  = TypeInfo { _typePackage    = "purescript-word"+                         , _typeModule     = "Data.Word"+                         , _typeName       = "Word"+                         , _typeParameters = []}+         in bst `shouldBe` ti++
test/TestData.hs view
@@ -30,6 +30,8 @@    haskType ^== mkTypeInfo (Proxy :: Proxy String)    return psString +data Simple a = Simple a deriving (Generic, Typeable, Show)+ data Foo = Foo          | Bar Int          | FooBar Int Text