{-# LANGUAGE OverloadedStrings #-}
-- | PureScript types to be used for bridges, e.g. in "Language.PureScript.Bridge.Primitives".
module Language.PureScript.Bridge.PSTypes where

import Data.Monoid
import qualified Data.Text as T

import Language.PureScript.Bridge.TypeInfo

-- | Uses  type parameters from existing TypeInfo:
psArray :: TypeInfo -> TypeInfo
psArray t = t {
    typePackage = "purescript-prim"
  , typeModule = "Prim"
  , typeName = "Array"
  }

psBool :: TypeInfo
psBool = TypeInfo {
    typePackage = "purescript-prim"
  , typeModule = "Prim"
  , typeName = "Boolean"
  , typeParameters = []
  }

-- | Uses  type parameters from existing TypeInfo:
psEither :: TypeInfo -> TypeInfo
psEither t = t {
    typePackage = "purescript-either"
  , typeModule = "Data.Either"
  , typeName = "Either"
  }

psInt :: TypeInfo
psInt = TypeInfo {
    typePackage = "purescript-prim"
  , typeModule = "Prim"
  , typeName = "Int"
  , typeParameters = []
  }

-- | Uses  type parameters from existing TypeInfo:
psMaybe :: TypeInfo -> TypeInfo
psMaybe t = t {
    typePackage = "purescript-maybe"
  , typeModule = "Data.Maybe"
  , typeName = "Maybe"
  }


psString :: TypeInfo
psString = TypeInfo {
    typePackage = "purescript-prim"
  , typeModule = "Prim"
  , typeName = "String"
  , typeParameters = []
  }

-- | Uses  type parameters from existing TypeInfo:
psTuple :: TypeInfo -> TypeInfo
psTuple t = t {
      typePackage = "purescript-tuples"
    , typeModule = if size == 2 then "Data.Tuple" else "Data.Tuple.Nested"
    , typeName = "Tuple" <> if size == 2 then "" else T.pack (show size)
    }
  where
    size = length (typeParameters t)

psUnit :: TypeInfo
psUnit = TypeInfo  {
    typePackage = "purescript-prelude"
  , typeModule = "Prelude"
  , typeName = "Unit"
  , typeParameters = []
  }