{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeSynonymInstances #-} module Main where import qualified Data.Map as Map import Data.Proxy import Data.Text (Text) import qualified Data.Text as T import Data.Typeable import GHC.Generics (Generic) import Language.PureScript.Bridge import Language.PureScript.Bridge.PSTypes import Language.PureScript.Bridge.TypeParameters -- Check that examples compile: textBridge :: BridgePart textBridge = do typeName ^== "Text" typeModule ^== "Data.Text.Internal" <|> typeModule ^== "Data.Text.Internal.Lazy" return psString stringBridge :: BridgePart stringBridge = do haskType ^== mkTypeInfo (Proxy :: Proxy String) return psString data Foo = Foo | Bar Int | FooBar Int Text deriving (Generic, Typeable, Show) data Bar a b m = Bar1 (Maybe a) | Bar2 (Either a b) | Bar3 a | Bar4 { myMonadicResult :: m b } deriving (Generic, Typeable, Show) main :: IO () main = do let r = buildBridge defaultBridge (mkTypeInfo (Proxy :: Proxy Int)) let r2 = bridgeSumType (buildBridge defaultBridge) (mkSumType (Proxy :: Proxy Foo)) putStrLn "Bridge a single int: " print r putStrLn "\nBridge Foo:" print r2 let advanced = bridgeSumType (buildBridge defaultBridge) (mkSumType (Proxy :: Proxy (Bar A B M1))) let modules = sumTypeToModule advanced Map.empty let m = head . map moduleToText . Map.elems $ modules putStrLn "\n Complete module for Bar type:\n" putStrLn $ T.unpack m