Make stack flags customizable in GNUmakefile.
[haskell/symantic.git] / symantic-lib / Language / Symantic / Lib / MonoFunctor.hs
index f4839c0e8cf7db7a3435a29621ecb92eea4f371e..b34c7498a9638b8e18f8666860ab342e3ec214bd 100644 (file)
@@ -1,97 +1,79 @@
 {-# LANGUAGE UndecidableInstances #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
-{-# OPTIONS_GHC -fconstraint-solver-iterations=8 #-}
 -- | Symantic for 'MonoFunctor'.
 module Language.Symantic.Lib.MonoFunctor where
 
-import Control.Monad (liftM2)
 import Data.MonoTraversable (MonoFunctor)
-import Data.Proxy
-import Data.Type.Equality ((:~:)(Refl))
-import GHC.Exts (Constraint)
 import qualified Data.MonoTraversable as MT
 
-import Language.Symantic.Parsing
-import Language.Symantic.Typing
-import Language.Symantic.Compiling
-import Language.Symantic.Interpreting
-import Language.Symantic.Transforming
+import Language.Symantic
+import Language.Symantic.Lib.Function ()
+
+-- * Type 'Element'
+data Element
+type instance Fam Element '[h] = MT.Element (UnProxy h)
+instance NameTyOf Element where
+       nameTyOf _c = ["MonoFunctor"] `Mod` "Element"
+instance ClassInstancesFor Element
+instance TypeInstancesFor Element where
+       expandFamFor _c _len f (TyApp _ (TyApp _ z _ty_r) a `TypesS` TypesZ)
+        | Just HRefl <- proj_ConstKi @_ @Element f
+        , Just HRefl <- proj_ConstKiTy @_ @(->) z
+        = Just a
+       expandFamFor _c _len _fam _as = Nothing
+
+-- ** 'Type's
+famElement :: Source src => Type src vs t -> Type src vs (MT.Element t)
+famElement o = TyFam noSource (lenVars o) (constInj @Element) (o `TypesS` TypesZ)
 
 -- * Class 'Sym_MonoFunctor'
+type instance Sym MonoFunctor = Sym_MonoFunctor
 class Sym_MonoFunctor term where
        omap :: MonoFunctor o => term (MT.Element o -> MT.Element o) -> term o -> term o
-       default omap :: (Trans t term, MonoFunctor o)
-        => t term (MT.Element o -> MT.Element o) -> t term o -> t term o
-       omap = trans_map2 omap
+       default omap
+        :: Sym_MonoFunctor (UnT term)
+        => Trans term
+        => MonoFunctor o
+        => term (MT.Element o -> MT.Element o) -> term o -> term o
+       omap = trans2 omap
+
+-- Interpreting
+instance Sym_MonoFunctor Eval where
+       omap = eval2 MT.omap
+instance Sym_MonoFunctor View where
+       omap = view2 "omap"
+instance (Sym_MonoFunctor r1, Sym_MonoFunctor r2) => Sym_MonoFunctor (Dup r1 r2) where
+       omap = dup2 @Sym_MonoFunctor omap
 
-type instance Sym_of_Iface (Proxy MonoFunctor) = Sym_MonoFunctor
-type instance TyConsts_of_Iface (Proxy MonoFunctor) = Proxy MonoFunctor ': TyConsts_imported_by (Proxy MonoFunctor)
-type instance TyConsts_imported_by (Proxy MonoFunctor) = '[ Proxy (->) ]
+-- Transforming
+instance (Sym_MonoFunctor term, Sym_Lambda term) => Sym_MonoFunctor (BetaT term)
 
-instance Sym_MonoFunctor HostI where
-       omap = liftM2 MT.omap
-instance Sym_MonoFunctor TextI where
-       omap = textI2 "omap"
-instance (Sym_MonoFunctor r1, Sym_MonoFunctor r2) => Sym_MonoFunctor (DupI r1 r2) where
-       omap = dupI2 @Sym_MonoFunctor omap
+-- Typing
+instance NameTyOf MonoFunctor where
+       nameTyOf _c = ["MonoFunctor"] `Mod` "MonoFunctor"
+instance FixityOf MonoFunctor
+instance ClassInstancesFor MonoFunctor
+instance TypeInstancesFor MonoFunctor
 
-instance
- ( Read_TyNameR TyName cs rs
- , Inj_TyConst cs MonoFunctor
- ) => Read_TyNameR TyName cs (Proxy MonoFunctor ': rs) where
-       read_TyNameR _cs (TyName "MonoFunctor") k = k (ty @MonoFunctor)
-       read_TyNameR _rs raw k = read_TyNameR (Proxy @rs) raw k
-instance Show_TyConst cs => Show_TyConst (Proxy MonoFunctor ': cs) where
-       show_TyConst TyConstZ{} = "MonoFunctor"
-       show_TyConst (TyConstS c) = show_TyConst c
+-- Compiling
+instance Gram_Term_AtomsFor src ss g MonoFunctor
+instance (Source src, SymInj ss MonoFunctor) => ModuleFor src ss MonoFunctor where
+       moduleFor = ["MonoFunctor"] `moduleWhere`
+        [ "omap" := teMonoFunctor_omap
+        ]
 
--- * Type 'TyFam_MonoElement'
-data TyFam_MonoElement
- =   TyFam_MonoElement
- deriving (Eq, Show)
-type instance TyFam TyFam_MonoElement '[h] = MT.Element (UnProxy h)
+-- ** 'Type's
+tyMonoFunctor :: Source src => Type src vs a -> Type src vs (MonoFunctor a)
+tyMonoFunctor a = tyConstLen @(K MonoFunctor) @MonoFunctor (lenVars a) `tyApp` a
 
-instance -- Constraint
- Proj_TyFamC cs TyFam_MonoElement (c::Constraint)
-instance -- k -> Constraint
- Proj_TyFamC cs TyFam_MonoElement (c::k -> Constraint)
+o0 :: Source src => LenInj vs => KindInj (K o) =>
+     Type src (Proxy o ': vs) o
+o0 = tyVar "o" varZ
 
-instance Proj_TyConC cs (Proxy MonoFunctor)
+e1 :: Source src => LenInj vs => KindInj (K e) =>
+     Type src (a ': Proxy e ': vs) e
+e1 = tyVar "e" $ VarS varZ
 
-data instance TokenT meta (ts::[*]) (Proxy MonoFunctor)
- = Token_Term_MonoFunctor_omap (EToken meta ts) (EToken meta ts)
-deriving instance Eq_Token meta ts => Eq (TokenT meta ts (Proxy MonoFunctor))
-deriving instance Show_Token meta ts => Show (TokenT meta ts (Proxy MonoFunctor))
-instance -- CompileI
- ( Inj_TyConst cs MonoFunctor
- , Inj_TyConst cs (->)
- , Proj_TyCon  cs
- , Proj_TyFam  cs TyFam_MonoElement
- , Compile cs is
- ) => CompileI cs is (Proxy MonoFunctor) where
-       compileI tok ctx k =
-               case tok of
-                Token_Term_MonoFunctor_omap tok_f tok_o ->
-                       -- omap :: (Element o -> Element o) -> o -> o
-                       compile tok_f ctx $ \ty_f (Term f) ->
-                       compile tok_o ctx $ \ty_o (Term m) ->
-                       check_TyEq2 (ty @(->)) (At (Just tok_f) ty_f) $ \Refl ty_f_a ty_f_b ->
-                       check_TyEq
-                        (At (Just tok_f) ty_f_a)
-                        (At (Just tok_f) ty_f_b) $ \Refl ->
-                       check_TyCon (At (Just tok_f) (ty @MonoFunctor :$ ty_o)) $ \TyCon ->
-                       check_TyFam (At (Just tok_o) TyFam_MonoElement) (ty_o `TypesS` TypesZ) $ \ty_o_e ->
-                       check_TyEq
-                        (At Nothing ty_o_e)
-                        (At (Just tok_f) ty_f_a) $ \Refl ->
-                       k ty_o $ Term $
-                        \c -> omap (f c) (m c)
-instance -- TokenizeT
- Inj_Token meta ts MonoFunctor =>
- TokenizeT meta ts (Proxy MonoFunctor) where
-       tokenizeT _t = mempty
-        { tokenizers_infix = tokenizeTMod []
-                [ tokenize2 "omap" infixN5 Token_Term_MonoFunctor_omap
-                ]
-        }
-instance Gram_Term_AtomsT meta ts (Proxy MonoFunctor) g
+-- ** 'Term's
+teMonoFunctor_omap :: TermDef MonoFunctor '[Proxy o, Proxy e] (MonoFunctor o # e #~ MT.Element o #> ((e -> e) -> o -> o))
+teMonoFunctor_omap = Term (tyMonoFunctor o0 # e1 #~ famElement o0) ((e1 ~> e1) ~> o0 ~> o0) $ teSym @MonoFunctor $ lam2 omap