1 {-# LANGUAGE UndecidableInstances #-}
2 {-# OPTIONS_GHC -fno-warn-orphans #-}
3 -- | Symantic for 'Char'.
4 module Language.Symantic.Lib.Char where
6 import Data.Char (Char)
8 import Data.Function (($), (.))
9 import Data.Functor ((<$>), (<$))
10 import Data.Maybe (Maybe(..))
12 import Data.String (String)
13 import Prelude (Bounded, Enum)
14 import Text.Show (Show(..))
15 import qualified Data.Char as Char
16 import qualified Data.Text as Text
18 import Language.Symantic.Grammar hiding (char)
19 import qualified Language.Symantic.Grammar as G
20 import Language.Symantic
21 import Language.Symantic.Lib.List (tyList)
24 type instance Sym Char = Sym_Char
25 class Sym_Char term where
26 char :: Char -> term Char
27 char_toUpper :: term Char -> term Char
28 char_toLower :: term Char -> term Char
30 default char :: Sym_Char (UnT term) => Trans term => Char -> term Char
31 default char_toUpper :: Sym_Char (UnT term) => Trans term => term Char -> term Char
32 default char_toLower :: Sym_Char (UnT term) => Trans term => term Char -> term Char
35 char_toUpper = trans1 char_toUpper
36 char_toLower = trans1 char_toLower
39 instance Sym_Char Eval where
41 char_toUpper = eval1 Char.toUpper
42 char_toLower = eval1 Char.toLower
43 instance Sym_Char View where
44 char a = View $ \_p _v ->
46 char_toUpper = view1 "Char.toUpper"
47 char_toLower = view1 "Char.toLower"
48 instance (Sym_Char r1, Sym_Char r2) => Sym_Char (Dup r1 r2) where
49 char x = char x `Dup` char x
50 char_toUpper = dup1 @Sym_Char char_toUpper
51 char_toLower = dup1 @Sym_Char char_toLower
54 instance (Sym_Char term, Sym_Lambda term) => Sym_Char (BetaT term)
57 instance NameTyOf Char where
58 nameTyOf _c = ["Char"] `Mod` "Char"
59 instance ClassInstancesFor Char where
60 proveConstraintFor _ (TyConst _ _ q :@ z)
61 | Just HRefl <- proj_ConstKiTy @_ @Char z
63 _ | Just Refl <- proj_Const @Bounded q -> Just Dict
64 | Just Refl <- proj_Const @Enum q -> Just Dict
65 | Just Refl <- proj_Const @Eq q -> Just Dict
66 | Just Refl <- proj_Const @Ord q -> Just Dict
67 | Just Refl <- proj_Const @Show q -> Just Dict
69 proveConstraintFor _c _q = Nothing
70 instance TypeInstancesFor Char
79 ) => Gram_Term_AtomsFor src ss g Char where
83 (\c src -> BinTree0 $ Token_Term $ TermAVT $ (`setSource` src) $ teChar c)
84 <$> between tickG tickG (
85 cfOf (G.any `but` tickG) <+>
90 tickG :: Gram_Char g' => g' Char
92 instance (Source src, SymInj ss Char) => ModuleFor src ss Char where
93 moduleFor = ["Char"] `moduleWhere`
94 [ "toLower" := teChar_toLower
95 , "toUpper" := teChar_toUpper
99 tyChar :: Source src => LenInj vs => Type src vs Char
100 tyChar = tyConst @(K Char) @Char
102 tyString :: Source src => LenInj vs => Type src vs String
103 tyString = tyList tyChar
106 teChar :: Source src => SymInj ss Char => Char -> Term src ss ts '[] (() #> Char)
107 teChar b = Term noConstraint tyChar $ teSym @Char $ char b
109 teChar_toUpper, teChar_toLower :: TermDef Char '[] (() #> (Char -> Char))
110 teChar_toUpper = Term noConstraint (tyChar ~> tyChar) $ teSym @Char $ lam1 char_toUpper
111 teChar_toLower = Term noConstraint (tyChar ~> tyChar) $ teSym @Char $ lam1 char_toLower