-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Generate PureScript data types from Haskell data types -- -- Generate PureScript data types from Haskell data types @package purescript-bridge @version 0.14.0.0 -- | General switches for the code generation, such as generating -- profunctor-lenses or not module Language.PureScript.Bridge.CodeGenSwitches -- | General settings for code generation data Settings Settings :: Bool -> Bool -> Maybe ForeignOptions -> Settings -- | use purescript-profunctor-lens for generated PS-types? [generateLenses] :: Settings -> Bool -- | generate generics using purescript-generics-rep instead of -- purescript-generics [genericsGenRep] :: Settings -> Bool -- | generate Foreign.Generic Encode and Decode instances [generateForeign] :: Settings -> Maybe ForeignOptions data ForeignOptions ForeignOptions :: Bool -> ForeignOptions [unwrapSingleConstructors] :: ForeignOptions -> Bool -- | Settings to generate Lenses defaultSettings :: Settings -- | settings for purescript 0.11.x purs_0_11_settings :: Settings -- | you can mappend switches to control the code generation type Switch = Endo Settings -- | Translate switches into settings getSettings :: Switch -> Settings -- | Default switches include code generation for lenses defaultSwitch :: Switch -- | Switch off the generatation of profunctor-lenses noLenses :: Switch -- | Switch on the generatation of profunctor-lenses genLenses :: Switch -- | Generate generics using purescript-generics useGen :: Switch -- | Generate generics using purescript-generics-rep useGenRep :: Switch genForeign :: ForeignOptions -> Switch noForeign :: Switch instance GHC.Show.Show Language.PureScript.Bridge.CodeGenSwitches.Settings instance GHC.Classes.Eq Language.PureScript.Bridge.CodeGenSwitches.Settings instance GHC.Show.Show Language.PureScript.Bridge.CodeGenSwitches.ForeignOptions instance GHC.Classes.Eq Language.PureScript.Bridge.CodeGenSwitches.ForeignOptions module Language.PureScript.Bridge.TypeInfo -- | Basic info about a data type: data TypeInfo (lang :: Language) TypeInfo :: !Text -> !Text -> !Text -> ![TypeInfo lang] -> TypeInfo -- | Hackage package [_typePackage] :: TypeInfo -> !Text -- | Full Module path [_typeModule] :: TypeInfo -> !Text [_typeName] :: TypeInfo -> !Text [_typeParameters] :: TypeInfo -> ![TypeInfo lang] -- | For convenience: type PSType = TypeInfo 'PureScript -- | For convenience: type HaskellType = TypeInfo 'Haskell mkTypeInfo :: Typeable t => Proxy t -> HaskellType mkTypeInfo' :: TypeRep -> HaskellType data Language Haskell :: Language PureScript :: Language typePackage :: forall lang_a9PV. Lens' (TypeInfo lang_a9PV) Text typeModule :: forall lang_a9PV. Lens' (TypeInfo lang_a9PV) Text typeName :: forall lang_a9PV. Lens' (TypeInfo lang_a9PV) Text typeParameters :: forall lang_a9PV lang_aczy. Lens (TypeInfo lang_a9PV) (TypeInfo lang_aczy) [TypeInfo lang_a9PV] [TypeInfo lang_aczy] -- | Types that have a lens for accessing a 'TypeInfo Haskell'. class HasHaskType t haskType :: HasHaskType t => Lens' t HaskellType -- | Put the TypeInfo in a list together with all its -- _typeParameters (recursively) flattenTypeInfo :: TypeInfo lang -> [TypeInfo lang] instance Language.PureScript.Bridge.TypeInfo.HasHaskType Language.PureScript.Bridge.TypeInfo.HaskellType instance GHC.Show.Show (Language.PureScript.Bridge.TypeInfo.TypeInfo lang) instance GHC.Classes.Ord (Language.PureScript.Bridge.TypeInfo.TypeInfo lang) instance GHC.Classes.Eq (Language.PureScript.Bridge.TypeInfo.TypeInfo lang) module Language.PureScript.Bridge.SumType -- | Generic representation of your Haskell types. data SumType (lang :: Language) SumType :: TypeInfo lang -> [DataConstructor lang] -> [Instance] -> SumType -- | Create a representation of your sum (and product) types, for doing -- type translations and writing it out to your PureScript modules. 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 -- | Ensure that an Instance instance is generated for your type. equal :: Eq a => Proxy a -> SumType t -> SumType t -- | Ensure that both Instance and Instance instances are -- generated for your type. order :: Ord a => Proxy a -> SumType t -> SumType t data DataConstructor (lang :: Language) DataConstructor :: !Text -> !Either [TypeInfo lang] [RecordEntry lang] -> DataConstructor -- | e.g. Left/Right for Either [_sigConstructor] :: DataConstructor -> !Text [_sigValues] :: DataConstructor -> !Either [TypeInfo lang] [RecordEntry lang] data RecordEntry (lang :: Language) RecordEntry :: !Text -> !TypeInfo lang -> RecordEntry -- | e.g. runState for State [_recLabel] :: RecordEntry -> !Text [_recValue] :: RecordEntry -> !TypeInfo lang -- | Purescript typeclass instances that can be generated for your Haskell -- types. data Instance Encode :: Instance Decode :: Instance Generic :: Instance Newtype :: Instance Eq :: Instance Ord :: Instance -- | The Purescript typeclass Newtype might be derivable if the -- original Haskell type was a simple type wrapper. nootype :: [DataConstructor lang] -> Maybe Instance -- | Get all used types in a sum type. -- -- This includes all types found at the right hand side of a sum type -- definition, not the type parameters of the sum type itself getUsedTypes :: SumType lang -> Set (TypeInfo lang) constructorToTypes :: DataConstructor lang -> Set (TypeInfo lang) -> Set (TypeInfo lang) sigConstructor :: forall lang_aj2h. Lens' (DataConstructor lang_aj2h) Text 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]) -- | TypInfo lens for SumType. sumTypeInfo :: Functor f => (TypeInfo lang -> f (TypeInfo lang)) -> SumType lang -> f (SumType lang) -- | DataConstructor lens for SumType. sumTypeConstructors :: Functor f => ([DataConstructor lang] -> f [DataConstructor lang]) -> SumType lang -> f (SumType lang) recLabel :: forall lang_aj2g. Lens' (RecordEntry lang_aj2g) Text recValue :: forall lang_aj2g lang_akXy. Lens (RecordEntry lang_aj2g) (RecordEntry lang_akXy) (TypeInfo lang_aj2g) (TypeInfo lang_akXy) instance GHC.Classes.Eq (Language.PureScript.Bridge.SumType.SumType lang) instance GHC.Show.Show (Language.PureScript.Bridge.SumType.SumType lang) instance GHC.Classes.Eq (Language.PureScript.Bridge.SumType.DataConstructor lang) instance GHC.Show.Show (Language.PureScript.Bridge.SumType.DataConstructor lang) instance GHC.Classes.Eq (Language.PureScript.Bridge.SumType.RecordEntry lang) instance GHC.Show.Show (Language.PureScript.Bridge.SumType.RecordEntry lang) instance GHC.Show.Show Language.PureScript.Bridge.SumType.Instance instance GHC.Classes.Eq Language.PureScript.Bridge.SumType.Instance instance (GHC.Generics.Constructor a, Language.PureScript.Bridge.SumType.GRecordEntry b) => Language.PureScript.Bridge.SumType.GDataConstructor (GHC.Generics.C1 a b) instance (Language.PureScript.Bridge.SumType.GRecordEntry a, Language.PureScript.Bridge.SumType.GRecordEntry b) => Language.PureScript.Bridge.SumType.GRecordEntry (a GHC.Generics.:*: b) instance Language.PureScript.Bridge.SumType.GRecordEntry GHC.Generics.U1 instance (GHC.Generics.Selector a, Data.Typeable.Internal.Typeable t) => Language.PureScript.Bridge.SumType.GRecordEntry (GHC.Generics.S1 a (GHC.Generics.K1 GHC.Generics.R t)) instance (GHC.Generics.Datatype a, Language.PureScript.Bridge.SumType.GDataConstructor c) => Language.PureScript.Bridge.SumType.GDataConstructor (GHC.Generics.D1 a c) instance (Language.PureScript.Bridge.SumType.GDataConstructor a, Language.PureScript.Bridge.SumType.GDataConstructor b) => Language.PureScript.Bridge.SumType.GDataConstructor (a GHC.Generics.:+: b) module Language.PureScript.Bridge.Printer data Module (lang :: Language) PSModule :: !Text -> !Map Text ImportLine -> ![SumType lang] -> Module [psModuleName] :: Module -> !Text [psImportLines] :: Module -> !Map Text ImportLine [psTypes] :: Module -> ![SumType lang] type PSModule = Module 'PureScript data ImportLine ImportLine :: !Text -> !Set Text -> ImportLine [importModule] :: ImportLine -> !Text [importTypes] :: ImportLine -> !Set Text type Modules = Map Text PSModule type ImportLines = Map Text ImportLine printModule :: Settings -> FilePath -> PSModule -> IO () sumTypesToNeededPackages :: [SumType lang] -> Set Text sumTypeToNeededPackages :: SumType lang -> Set Text moduleToText :: Settings -> Module 'PureScript -> Text _genericsImports :: Settings -> [ImportLine] _lensImports :: Settings -> [ImportLine] _foreignImports :: Settings -> [ImportLine] importLineToText :: ImportLine -> Text sumTypeToText :: Settings -> SumType 'PureScript -> Text sumTypeToTypeDecls :: Settings -> SumType 'PureScript -> Text -- | Given a Purescript type, generate instances for typeclass instances it -- claims to have. instances :: Settings -> SumType 'PureScript -> [Text] isTypeParam :: PSType -> PSType -> Bool encodeInstance :: PSType -> Text decodeInstance :: PSType -> Text genericInstance :: Settings -> PSType -> Text sumTypeToOptics :: SumType 'PureScript -> Text constructorOptics :: SumType 'PureScript -> Text recordOptics :: SumType 'PureScript -> Text constructorToText :: Int -> DataConstructor 'PureScript -> Text spaces :: Int -> Text typeNameAndForall :: TypeInfo 'PureScript -> (Text, Text) fromEntries :: (RecordEntry a -> Text) -> [RecordEntry a] -> Text mkFnArgs :: [RecordEntry 'PureScript] -> Text mkTypeSig :: [RecordEntry 'PureScript] -> Text constructorToOptic :: Bool -> TypeInfo 'PureScript -> DataConstructor 'PureScript -> Text recordEntryToLens :: SumType 'PureScript -> RecordEntry 'PureScript -> Text recordEntryToText :: RecordEntry 'PureScript -> Text typeInfoToText :: Bool -> PSType -> Text mergedTypeInfoToText :: PSType -> Text sumTypesToModules :: Modules -> [SumType 'PureScript] -> Modules sumTypeToModule :: SumType 'PureScript -> Modules -> Modules typesToImportLines :: ImportLines -> Set PSType -> ImportLines typeToImportLines :: PSType -> ImportLines -> ImportLines importsFromList :: [ImportLine] -> Map Text ImportLine mergeImportLines :: ImportLines -> ImportLines -> ImportLines unlessM :: Monad m => m Bool -> m () -> m () instance GHC.Show.Show (Language.PureScript.Bridge.Printer.Module lang) instance GHC.Show.Show Language.PureScript.Bridge.Printer.ImportLine -- | A bridge builder DSL, powered by Monad, Alternative and -- lens. -- -- Bridges can be built within the BridgeBuilder monad. You can -- check properties of the to-be-bridged HaskellType with -- ^== or doCheck, you have choice (<|>), you -- can fail (empty) and you can return a translated PSType -- (return). The HaskellType can be accessed with: -- --
--   view haskType
--   
-- -- Find usage examples in Language.PureScript.Bridge.Primitives -- and Language.PureScript.Bridge.PSTypes module Language.PureScript.Bridge.Builder data BridgeBuilder a type BridgePart = BridgeBuilder PSType -- | Bridges to use when a BridgePart returns Nothing (See -- buildBridgeWithCustomFixUp). -- -- It is similar to BridgeBuilder but does not offer choice or failure. -- It is used for constructing fallbacks if a BridgePart evaluates -- to Nothing. -- -- For type definitions you should use the more generic -- (MonadReader BridgeData m) constraint. This way your -- code will work in both FixUpBuilder and BridgeBuilder: -- --
--   {-# LANGUAGE FlexibleContexts #-}
--   
--   import           Control.Monad.Reader.Class
--   import           Language.PureScript.Bridge.TypeInfo
--   
data FixUpBuilder a type FixUpBridge = FixUpBuilder PSType data BridgeData -- | Lens for access to the complete bridge from within our Reader monad. -- -- This is used for example for implementing psTypeParameters. fullBridge :: Lens' BridgeData FullBridge -- | Check parts of haskType for equality: -- --
--   textBridge :: BridgePart
--   textBridge = do
--     typeName ^== "Text"
--     typeModule ^== "Data.Text.Internal" <|> typeModule ^== "Data.Text.Internal.Lazy"
--     return psString
--   
(^==) :: Eq a => Getter HaskellType a -> a -> BridgeBuilder () infix 4 ^== -- | Do some check on properties of haskType. doCheck :: Getter HaskellType a -> (a -> Bool) -> BridgeBuilder () -- | An associative binary operation (<|>) :: Alternative f => f a -> f a -> f a infixl 3 <|> -- | Bridge haskType typeParameters over to PureScript types. -- -- To be used for bridging type constructors. psTypeParameters :: MonadReader BridgeData m => m [PSType] type FullBridge = HaskellType -> PSType -- | Build a bridge. -- -- This is a convenience wrapper for buildBridgeWithCustomFixUp -- and should normally be sufficient. -- -- Definition: -- --
--   buildBridgeWithCustomFixUp clearPackageFixUp
--   
buildBridge :: BridgePart -> FullBridge -- | Bridge to PureScript by simply clearing out the _typePackage -- field. This bridge is used by default as FixUpBridge by -- buildBridge: -- --
--   buildBridge = buildBridgeWithCustomFixUp clearPackageFixUp
--   
-- -- Thus, if no bridge matches a type, it gets optimistically translated -- to a PureScript type which is idential to the Haskell type. Only the -- _typePackage field gets cleared, as it is very unlikely that -- the PureScript package is called the same as the Haskell package. -- -- Alternatively, if you are not that optimistic, you can use errorFixUp -- - which simply calls error when used. -- --
--   buildBridgeWithCustomFixUp errorFixUp yourBridge
--   
-- -- Of course you can also write your own FixUpBridge. It works the -- same as for BridgePart, but you can not have choice -- (<|>) or failure (empty). clearPackageFixUp :: MonadReader BridgeData m => m PSType -- | A FixUpBridge which calles error when used. Usage: -- --
--   buildBridgeWithCustomFixUp errorFixUp yourBridge
--   
errorFixUp :: MonadReader BridgeData m => m PSType -- | Takes a constructed BridgePart and makes it a total function -- (FullBridge) by using the supplied FixUpBridge when -- BridgePart returns Nothing. buildBridgeWithCustomFixUp :: FixUpBridge -> BridgePart -> FullBridge instance Control.Monad.Reader.Class.MonadReader Language.PureScript.Bridge.Builder.BridgeData Language.PureScript.Bridge.Builder.BridgeBuilder instance GHC.Base.Monad Language.PureScript.Bridge.Builder.BridgeBuilder instance GHC.Base.Applicative Language.PureScript.Bridge.Builder.BridgeBuilder instance GHC.Base.Functor Language.PureScript.Bridge.Builder.BridgeBuilder instance Control.Monad.Reader.Class.MonadReader Language.PureScript.Bridge.Builder.BridgeData Language.PureScript.Bridge.Builder.FixUpBuilder instance GHC.Base.Monad Language.PureScript.Bridge.Builder.FixUpBuilder instance GHC.Base.Applicative Language.PureScript.Bridge.Builder.FixUpBuilder instance GHC.Base.Functor Language.PureScript.Bridge.Builder.FixUpBuilder instance GHC.Base.Alternative Language.PureScript.Bridge.Builder.BridgeBuilder instance GHC.Base.MonadPlus Language.PureScript.Bridge.Builder.BridgeBuilder instance Language.PureScript.Bridge.TypeInfo.HasHaskType Language.PureScript.Bridge.Builder.BridgeData -- | PureScript types to be used for bridges, e.g. in -- Language.PureScript.Bridge.Primitives. module Language.PureScript.Bridge.PSTypes -- | Uses type parameters from haskType (bridged). psArray :: MonadReader BridgeData m => m PSType psBool :: PSType -- | Uses type parameters from haskType (bridged). psEither :: MonadReader BridgeData m => m PSType psInt :: PSType psNumber :: PSType -- | Uses type parameters from haskType (bridged). psMaybe :: MonadReader BridgeData m => m PSType psString :: PSType -- | Uses type parameters from haskType (bridged). psTuple :: MonadReader BridgeData m => m PSType psUnit :: PSType module Language.PureScript.Bridge.Tuple tupleBridge :: BridgePart data TupleParserState Start :: TupleParserState OpenFound :: TupleParserState ColonFound :: TupleParserState Tuple :: TupleParserState NoTuple :: TupleParserState step :: TupleParserState -> Char -> TupleParserState isTuple :: HaskellType -> Bool instance GHC.Show.Show Language.PureScript.Bridge.Tuple.TupleParserState instance GHC.Classes.Eq Language.PureScript.Bridge.Tuple.TupleParserState module Language.PureScript.Bridge.Primitives boolBridge :: BridgePart eitherBridge :: BridgePart -- | Dummy bridge, translates every type with clearPackageFixUp dummyBridge :: MonadReader BridgeData m => m PSType intBridge :: BridgePart doubleBridge :: BridgePart listBridge :: BridgePart maybeBridge :: BridgePart stringBridge :: BridgePart textBridge :: BridgePart unitBridge :: BridgePart noContentBridge :: BridgePart module Language.PureScript.Bridge -- | Translate all TypeInfo values in a SumType to PureScript -- types. -- -- Example usage, with defaultBridge: -- --
--   data Foo = Foo | Bar Int | FooBar Int Text deriving (Generic, Typeable, Show)
--   
-- --
--   bridgeSumType (buildBridge defaultBridge) (mkSumType (Proxy :: Proxy Foo))
--   
bridgeSumType :: FullBridge -> SumType 'Haskell -> SumType 'PureScript -- | Default bridge for mapping primitive/common types: You can append your -- own bridges like this: -- --
--   defaultBridge <|> myBridge1 <|> myBridge2
--   
-- -- Find examples for bridge definitions in -- Language.PureScript.Bridge.Primitives and -- Language.PureScript.Bridge.Tuple. defaultBridge :: BridgePart -- | Your entry point to this library and quite likely all you will need. -- Make sure all your types derive Generic and Typeable. -- Typeable is not needed from ghc-7.10 on. -- -- Then list all your types you want to use in PureScript and call -- writePSTypes: -- --
--   data Foo = Foo { ... } deriving (Eq, Generic)
--   data Bar = A | B | C deriving (Eq, Ord, Generic)
--   data Baz = ... deriving (Generic)
--   
--   -- | All types will have a `Generic` instance produced in Purescript.
--   myTypes :: [SumType 'Haskell]
--   myTypes =
--     [ let p = (Proxy :: Proxy Foo) in equal p (mkSumType p)  -- Also produce a `Eq` instance.
--     , let p = (Proxy :: Proxy Bar) in order p (mkSumType p)  -- Produce both `Eq` and `Ord`.
--     , mkSumType (Proxy :: Proxy Baz)  -- Just produce a `Generic` instance.
--     ]
--   
--    writePSTypes "path/to/your/purescript/project" (buildBridge defaultBridge) myTypes
--   
-- -- You can define your own type bridges based on defaultBridge: -- --
--   myBridge = defaultBridge <|> mySpecialTypeBridge
--   
-- -- and use it with writePSTypes: -- --
--   writePSTypes "path/to/your/purescript/project" (buildBridge myBridge) myTypes
--   
-- -- Find examples for implementing your own bridges in: -- Language.PureScript.Bridge.Primitives. -- --

Result:

-- -- writePSTypes will write out PureScript modules to the given -- path, mirroring the hierarchy of the Haskell modules the types came -- from. In addition a list of needed PS packages is printed to the -- console. -- -- The list of needed packages is retrieved from the bridged -- TypeInfo data, so make sure you set _typePackage -- correctly in your own bridges, in order for this feature to be useful. -- --

Real world usage example (at time of this writing outdated, at -- time of reading hopefully fixed):

-- -- A real world use case of this library can be found here. -- -- With custom bridges defined here and custom PS types defined -- here. -- -- Parts of the generated output can be found here. -- -- Note how Secret and Key get translated according to -- our custom rules, with correct imports and everything. Also the -- formatting is quite nice, would you have guessed that this code was -- generated? -- --

WARNING:

-- -- This function overwrites files - make backups or use version control! writePSTypes :: FilePath -> FullBridge -> [SumType 'Haskell] -> IO () -- | Works like writePSTypes but you can add additional switches to -- control the generation of your PureScript code -- --

Switches/Settings:

-- -- -- --

WARNING:

-- -- This function overwrites files - make backups or use version control! writePSTypesWith :: Switch -> FilePath -> FullBridge -> [SumType 'Haskell] -> IO () -- | Default switches include code generation for lenses defaultSwitch :: Switch -- | Switch off the generatation of profunctor-lenses noLenses :: Switch -- | Switch on the generatation of profunctor-lenses genLenses :: Switch -- | As we translate types and not type constructors, we have to pass dummy -- types to any type constructor. -- -- buildBridge will translate all parameter types which come -- from a module TypeParameters (e.g. this one) to lower case. -- -- For translating something like Maybe: -- --
--   data Maybe' a = Nothing' | Just' a
--   
--   
-- -- you would use: -- --
--   import Language.PureScript.Bridge
--   import Language.PureScript.Bridge.TypeParameters
--   
--   st = mkSumType (Proxy :: Proxy (Maybe' A)) -- Note that we use "Maybe' A" instead of just Maybe - which would not work.
--   
--   
module Language.PureScript.Bridge.TypeParameters data A data B data C data D data E data F data G data H data I data J data K data L data M data N data O data P data Q data R data S data T data U data V data W data X data Y data Z -- | You can use those if your type parameters are actually type -- constructors as well: st = mkSumType (Proxy :: Proxy -- (ReaderT R M1 A)) data A1 a data B1 a data C1 a data D1 a data E1 a data F1 a data G1 a data H1 a data I1 a data J1 a data K1 a data L1 a data M1 a data N1 a data O1 a data P1 a data Q1 a data R1 a data S1 a data T1 a data U1 a data V1 a data W1 a data X1 a data Y1 a data Z1 a