{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} -- | Expression for 'Integer'. module Language.Symantic.Expr.Integer where import Data.Proxy import qualified Data.Text as Text import Language.Symantic.Type import Language.Symantic.Repr import Language.Symantic.Expr.Root import Language.Symantic.Expr.Error import Language.Symantic.Expr.From import Language.Symantic.Trans.Common -- * Class 'Sym_Int' -- | Symantic. class Sym_Integer repr where integer :: Integer -> repr Integer default integer :: Trans t repr => Integer -> t repr Integer integer = trans_lift . integer instance Sym_Integer Repr_Host where integer = Repr_Host instance Sym_Integer Repr_Text where integer a = Repr_Text $ \_p _v -> Text.pack (show a) instance (Sym_Integer r1, Sym_Integer r2) => Sym_Integer (Repr_Dup r1 r2) where integer x = integer x `Repr_Dup` integer x sym_Integer :: Proxy Sym_Integer sym_Integer = Proxy -- * Type 'Expr_Integer' -- | Expression. data Expr_Integer (root:: *) type instance Root_of_Expr (Expr_Integer root) = root type instance Type_of_Expr (Expr_Integer root) = Type_Integer type instance Sym_of_Expr (Expr_Integer root) repr = Sym_Integer repr type instance Error_of_Expr ast (Expr_Integer root) = No_Error_Expr