{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE TemplateHaskell #-}
-- | Various constants which refer to things in Prim
module Language.PureScript.Constants.Prim where

import Language.PureScript.Names (ModuleName)
import Language.PureScript.Constants.TH qualified as TH

$(TH.declare do
  TH.mod "Prim" do
    TH.cls "Partial"
    TH.ty "Array"
    TH.ty "Boolean"
    TH.ty "Char"
    TH.ty "Constraint"
    TH.ty "Function"
    TH.ty "Int"
    TH.ty "Number"
    TH.ty "Record"
    TH.ty "Row"
    TH.ty "String"
    TH.ty "Symbol"
    TH.ty "Type"
    TH.asIdent do TH.asString do TH.var "undefined"

  TH.mod "Prim.Boolean" do
    TH.tys ["False", "True"]

  TH.mod "Prim.Coerce" do
    TH.cls "Coercible"

  TH.mod "Prim.Int" do
    TH.prefixWith "Int" do TH.clss ["Add", "Compare", "Mul", "ToString"]

  TH.mod "Prim.Ordering" do
    TH.prefixWith "Type" do TH.ty "Ordering"
    TH.tys ["EQ", "GT", "LT"]

  TH.mod "Prim.Row" do
    TH.prefixWith "Row" do TH.clss ["Cons", "Lacks", "Nub", "Union"]
  
  TH.mod "Prim.RowList" do
    TH.ty "RowList"
    TH.cls "RowToList"
    TH.prefixWith "RowList" do TH.tys ["Cons", "Nil"]

  TH.mod "Prim.Symbol" do
    TH.prefixWith "Symbol" do TH.clss ["Append", "Compare", "Cons"]

  TH.mod "Prim.TypeError" do
    TH.clss ["Fail", "Warn"]
    TH.tys ["Above", "Beside", "Doc", "Quote", "QuoteLabel", "Text"]

  )

primModules :: [ModuleName]
primModules :: [ModuleName]
primModules = [ModuleName
M_Prim, ModuleName
M_Prim_Boolean, ModuleName
M_Prim_Coerce, ModuleName
M_Prim_Ordering, ModuleName
M_Prim_Row, ModuleName
M_Prim_RowList, ModuleName
M_Prim_Symbol, ModuleName
M_Prim_Int, ModuleName
M_Prim_TypeError]