packages feed

purescript-bridge-0.4.0.0: test/Spec.hs

{-# 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