{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE DataKinds #-}


module Language.PureScript.Bridge.Primitives where


import           Data.Proxy
import           Language.PureScript.Bridge.Builder
import           Language.PureScript.Bridge.PSTypes
import           Language.PureScript.Bridge.TypeInfo
import           Control.Monad.Reader.Class


boolBridge :: BridgePart
boolBridge :: BridgePart
boolBridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Bool" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return PSType
psBool

eitherBridge :: BridgePart
eitherBridge :: BridgePart
eitherBridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Either" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *). MonadReader BridgeData m => m PSType
psEither

strMapBridge :: BridgePart
strMapBridge :: BridgePart
strMapBridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Map" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *). MonadReader BridgeData m => m PSType
psObject

-- | Dummy bridge, translates every type with 'clearPackageFixUp'
dummyBridge :: MonadReader BridgeData m => m PSType
dummyBridge :: forall (m :: * -> *). MonadReader BridgeData m => m PSType
dummyBridge = forall (m :: * -> *). MonadReader BridgeData m => m PSType
clearPackageFixUp

intBridge :: BridgePart
intBridge :: BridgePart
intBridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Int" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return PSType
psInt

doubleBridge :: BridgePart
doubleBridge :: BridgePart
doubleBridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Double" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return PSType
psNumber

listBridge :: BridgePart
listBridge :: BridgePart
listBridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"[]" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *). MonadReader BridgeData m => m PSType
psArray

maybeBridge :: BridgePart
maybeBridge :: BridgePart
maybeBridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Maybe" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *). MonadReader BridgeData m => m PSType
psMaybe

stringBridge :: BridgePart
stringBridge :: BridgePart
stringBridge = forall t. HasHaskType t => Lens' t HaskellType
haskType forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== forall t. Typeable t => Proxy t -> HaskellType
mkTypeInfo (forall {k} (t :: k). Proxy t
Proxy :: Proxy String ) forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return PSType
psString

textBridge :: BridgePart
textBridge :: BridgePart
textBridge = do
    forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName   forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Text"
    forall (lang :: Language). Lens' (TypeInfo lang) Text
typeModule forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Data.Text.Internal" forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (lang :: Language). Lens' (TypeInfo lang) Text
typeModule forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Data.Text.Internal.Lazy"
    forall (m :: * -> *) a. Monad m => a -> m a
return PSType
psString

unitBridge :: BridgePart
unitBridge :: BridgePart
unitBridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"()" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return PSType
psUnit

noContentBridge :: BridgePart
noContentBridge :: BridgePart
noContentBridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"NoContent" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return PSType
psUnit

wordBridge :: BridgePart
wordBridge :: BridgePart
wordBridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Word" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return PSType
psWord

word8Bridge :: BridgePart
word8Bridge :: BridgePart
word8Bridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Word8" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return PSType
psWord8

word16Bridge :: BridgePart
word16Bridge :: BridgePart
word16Bridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Word16" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return PSType
psWord16

word32Bridge :: BridgePart
word32Bridge :: BridgePart
word32Bridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Word32" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return PSType
psWord32

word64Bridge :: BridgePart
word64Bridge :: BridgePart
word64Bridge = forall (lang :: Language). Lens' (TypeInfo lang) Text
typeName forall a. Eq a => Getter HaskellType a -> a -> BridgeBuilder ()
^== Text
"Word64" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return PSType
psWord64