Bump versions.
[haskell/symantic.git] / symantic-lib / Language / Symantic / Lib / Sequences.hs
index 198378a26f62704e7f22f4756207d8d1d83ddd78..7257d18dcf5d9b96a89a50b73019d2d789b0b2bf 100644 (file)
 -- | Symantic for 'Sequences'.
 module Language.Symantic.Lib.Sequences where
 
-import Control.Monad (liftM, liftM2)
-import Data.Proxy
 import Data.Sequences (SemiSequence, IsSequence)
-import Data.Type.Equality ((:~:)(Refl))
 import Prelude hiding (filter, reverse)
 import qualified Data.MonoTraversable as MT
 import qualified Data.Sequences as Seqs
 
-import Language.Symantic.Parsing
-import Language.Symantic.Typing
-import Language.Symantic.Compiling
-import Language.Symantic.Interpreting
-import Language.Symantic.Transforming
-import Language.Symantic.Lib.MonoFunctor (TyFam_MonoElement(..))
+import Language.Symantic
+import Language.Symantic.Lib.Function ()
+import Language.Symantic.Lib.Bool (tyBool)
+import Language.Symantic.Lib.MonoFunctor (e1, famElement)
 
 -- * Class 'Sym_SemiSequence'
+type instance Sym SemiSequence = Sym_SemiSequence
 class Sym_SemiSequence term where
        intersperse :: SemiSequence s => term (MT.Element s) -> term s -> term s
        cons        :: SemiSequence s => term (MT.Element s) -> term s -> term s
        snoc        :: SemiSequence s => term s -> term (MT.Element s) -> term s
        reverse     :: SemiSequence s => term s -> term s
-       default intersperse :: (Trans t term, SemiSequence s) => t term (MT.Element s) -> t term s -> t term s
-       default cons        :: (Trans t term, SemiSequence s) => t term (MT.Element s) -> t term s -> t term s
-       default snoc        :: (Trans t term, SemiSequence s) => t term s -> t term (MT.Element s) -> t term s
-       default reverse     :: (Trans t term, SemiSequence s) => t term s -> t term s
-       intersperse = trans_map2 cons
-       cons        = trans_map2 cons
-       snoc        = trans_map2 snoc
-       reverse     = trans_map1 reverse
-
-type instance Sym_of_Iface (Proxy SemiSequence) = Sym_SemiSequence
-type instance TyConsts_of_Iface (Proxy SemiSequence) = Proxy SemiSequence ': TyConsts_imported_by (Proxy SemiSequence)
-type instance TyConsts_imported_by (Proxy SemiSequence) = '[]
-
-instance Sym_SemiSequence HostI where
-       intersperse = liftM2 Seqs.intersperse
-       cons        = liftM2 Seqs.cons
-       snoc        = liftM2 Seqs.snoc
-       reverse     = liftM  Seqs.reverse
-instance Sym_SemiSequence TextI where
-       intersperse = textI2 "intersperse"
-       cons        = textI2 "cons"
-       snoc        = textI2 "snoc"
-       reverse     = textI1 "reverse"
-instance (Sym_SemiSequence r1, Sym_SemiSequence r2) => Sym_SemiSequence (DupI r1 r2) where
-       intersperse = dupI2 @Sym_SemiSequence intersperse
-       cons        = dupI2 @Sym_SemiSequence cons
-       snoc        = dupI2 @Sym_SemiSequence snoc
-       reverse     = dupI1 @Sym_SemiSequence reverse
-
-instance
- ( Read_TyNameR TyName cs rs
- , Inj_TyConst cs SemiSequence
- ) => Read_TyNameR TyName cs (Proxy SemiSequence ': rs) where
-       read_TyNameR _cs (TyName "SemiSequence") k = k (ty @SemiSequence)
-       read_TyNameR _rs raw k = read_TyNameR (Proxy @rs) raw k
-instance Show_TyConst cs => Show_TyConst (Proxy SemiSequence ': cs) where
-       show_TyConst TyConstZ{} = "SemiSequence"
-       show_TyConst (TyConstS c) = show_TyConst c
-
-instance Proj_TyConC cs (Proxy SemiSequence)
-
-data instance TokenT meta (ts::[*]) (Proxy SemiSequence)
- = Token_Term_SemiSequence_intersperse (EToken meta ts) (EToken meta ts)
- | Token_Term_SemiSequence_cons        (EToken meta ts) (EToken meta ts)
- | Token_Term_SemiSequence_snoc        (EToken meta ts) (EToken meta ts)
- | Token_Term_SemiSequence_reverse     (EToken meta ts)
-deriving instance Eq_Token meta ts => Eq (TokenT meta ts (Proxy SemiSequence))
-deriving instance Show_Token meta ts => Show (TokenT meta ts (Proxy SemiSequence))
-instance -- CompileI
- ( Inj_TyConst cs SemiSequence
- , Proj_TyCon  cs
- , Proj_TyFam  cs TyFam_MonoElement
- , Compile cs is
- ) => CompileI cs is (Proxy SemiSequence) where
-       compileI
-        :: forall meta ctx ret ls rs.
-        TokenT meta is (Proxy SemiSequence)
-        -> Compiler meta ctx ret cs is ls (Proxy SemiSequence ': rs)
-       compileI tok ctx k =
-               case tok of
-                Token_Term_SemiSequence_intersperse tok_e tok_s ->
-                       e2s2s_from tok_e tok_s intersperse
-                Token_Term_SemiSequence_cons tok_e tok_s ->
-                       e2s2s_from tok_e tok_s cons
-                Token_Term_SemiSequence_snoc tok_s tok_e ->
-                       e2s2s_from tok_s tok_e (Prelude.flip snoc)
-                Token_Term_SemiSequence_reverse tok_s ->
-                       -- reverse :: SemiSequence s => s -> s
-                       compile tok_s ctx $ \ty_s (Term s) ->
-                       check_TyCon (At (Just tok_s) (ty @SemiSequence :$ ty_s)) $ \TyCon ->
-                       k ty_s $ Term $
-                        \c -> reverse (s c)
-               where
-               e2s2s_from tok_e tok_s
-                (f::forall term s.
-                        (Sym_SemiSequence term, SemiSequence s)
-                        => term (MT.Element s) -> term s -> term s) =
-                -- intersperse :: SemiSequence s => MT.Element s -> s -> s
-                -- cons        :: SemiSequence s => MT.Element s -> s -> s
-                -- snoc        :: SemiSequence s => s -> MT.Element s -> s
-                       compile tok_e ctx $ \ty_e (Term e) ->
-                       compile tok_s ctx $ \ty_s (Term s) ->
-                       check_TyCon (At (Just tok_s) (ty @SemiSequence :$ ty_s)) $ \TyCon ->
-                       check_TyFam (At (Just tok_s) TyFam_MonoElement) (ty_s `TypesS` TypesZ) $ \ty_s_e ->
-                       check_TyEq (At Nothing ty_s_e) (At (Just tok_e) ty_e) $ \Refl ->
-                       k ty_s $ Term $
-                        \c -> f (e c) (s c)
-instance -- TokenizeT
- Inj_Token meta ts SemiSequence =>
- TokenizeT meta ts (Proxy SemiSequence) where
-       tokenizeT _t = mempty
-        { tokenizers_infix = tokenizeTMod []
-                [ tokenize2 "intersperse" infixN5 Token_Term_SemiSequence_intersperse
-                , tokenize2 "cons"        infixN5 Token_Term_SemiSequence_cons
-                , tokenize2 "snoc"        infixN5 Token_Term_SemiSequence_snoc
-                , tokenize1 "reverse"     infixN5 Token_Term_SemiSequence_reverse
-                ]
-        }
-instance Gram_Term_AtomsT meta ts (Proxy SemiSequence) g
+       default intersperse :: Sym_SemiSequence (UnT term) => Trans term => SemiSequence s => term (MT.Element s) -> term s -> term s
+       default cons        :: Sym_SemiSequence (UnT term) => Trans term => SemiSequence s => term (MT.Element s) -> term s -> term s
+       default snoc        :: Sym_SemiSequence (UnT term) => Trans term => SemiSequence s => term s -> term (MT.Element s) -> term s
+       default reverse     :: Sym_SemiSequence (UnT term) => Trans term => SemiSequence s => term s -> term s
+       intersperse = trans2 cons
+       cons        = trans2 cons
+       snoc        = trans2 snoc
+       reverse     = trans1 reverse
+
+-- Interpreting
+instance Sym_SemiSequence Eval where
+       intersperse = eval2 Seqs.intersperse
+       cons        = eval2 Seqs.cons
+       snoc        = eval2 Seqs.snoc
+       reverse     = eval1 Seqs.reverse
+instance Sym_SemiSequence View where
+       intersperse = view2 "intersperse"
+       cons        = view2 "cons"
+       snoc        = view2 "snoc"
+       reverse     = view1 "reverse"
+instance (Sym_SemiSequence r1, Sym_SemiSequence r2) => Sym_SemiSequence (Dup r1 r2) where
+       intersperse = dup2 @Sym_SemiSequence intersperse
+       cons        = dup2 @Sym_SemiSequence cons
+       snoc        = dup2 @Sym_SemiSequence snoc
+       reverse     = dup1 @Sym_SemiSequence reverse
+
+-- Transforming
+instance (Sym_SemiSequence term, Sym_Lambda term) => Sym_SemiSequence (BetaT term)
+
+-- Typing
+instance NameTyOf SemiSequence where
+       nameTyOf _c = ["SemiSequence"] `Mod` "SemiSequence"
+instance FixityOf SemiSequence
+instance ClassInstancesFor SemiSequence
+instance TypeInstancesFor SemiSequence
+
+-- Compiling
+instance Gram_Term_AtomsFor src ss g SemiSequence
+instance (Source src, SymInj ss SemiSequence) => ModuleFor src ss SemiSequence where
+       moduleFor = ["SemiSequence"] `moduleWhere`
+        [ "intersperse" := teSemiSequence_intersperse
+        , "cons"        := teSemiSequence_cons
+        , "snoc"        := teSemiSequence_snoc
+        , "reverse"     := teSemiSequence_reverse
+        ]
+
+-- ** 'Type's
+tySemiSequence :: Source src => Type src vs a -> Type src vs (SemiSequence a)
+tySemiSequence a = tyConstLen @(K SemiSequence) @SemiSequence (lenVars a) `tyApp` a
+
+s0 :: Source src => LenInj vs => KindInj (K s) =>
+      Type src (Proxy s ': vs) s
+s0 = tyVar "s" varZ
+
+-- ** 'Term's
+teSemiSequence_reverse :: TermDef SemiSequence '[Proxy s, Proxy e] (SemiSequence s # e #~ MT.Element s #> (s -> s))
+teSemiSequence_reverse = Term (tySemiSequence s0 # e1 #~ famElement s0) (s0 ~> s0) $ teSym @SemiSequence $ lam1 reverse
+
+teSemiSequence_intersperse, teSemiSequence_cons :: TermDef SemiSequence '[Proxy s, Proxy e] (SemiSequence s # e #~ MT.Element s #> (e -> s -> s))
+teSemiSequence_intersperse = Term (tySemiSequence s0 # e1 #~ famElement s0) (e1 ~> s0 ~> s0) $ teSym @SemiSequence $ lam2 intersperse
+teSemiSequence_cons = Term (tySemiSequence s0 # e1 #~ famElement s0) (e1 ~> s0 ~> s0) $ teSym @SemiSequence $ lam2 cons
+
+teSemiSequence_snoc :: TermDef SemiSequence '[Proxy s, Proxy e] (SemiSequence s # e #~ MT.Element s #> (s -> e -> s))
+teSemiSequence_snoc = Term (tySemiSequence s0 # e1 #~ famElement s0) (s0 ~> e1 ~> s0) $ teSym @SemiSequence $ lam2 snoc
 
 -- * Class 'Sym_IsSequence'
+type instance Sym IsSequence = Sym_IsSequence
 class Sym_IsSequence term where
        filter :: IsSequence s => term (MT.Element s -> Bool) -> term s -> term s
-       default filter :: (Trans t term, IsSequence s) => t term (MT.Element s -> Bool) -> t term s -> t term s
-       filter  = trans_map2 filter
-
-type instance Sym_of_Iface (Proxy IsSequence) = Sym_IsSequence
-type instance TyConsts_of_Iface (Proxy IsSequence) = Proxy IsSequence ': TyConsts_imported_by (Proxy IsSequence)
-type instance TyConsts_imported_by (Proxy IsSequence) =
- [ Proxy IsSequence
- , Proxy (->)
- , Proxy Bool
- ]
-
-instance Sym_IsSequence HostI where
-       filter  = liftM2 Seqs.filter
-instance Sym_IsSequence TextI where
-       filter  = textI2 "filter"
-instance (Sym_IsSequence r1, Sym_IsSequence r2) => Sym_IsSequence (DupI r1 r2) where
-       filter  = dupI2 @Sym_IsSequence filter
-
-instance
- ( Read_TyNameR TyName cs rs
- , Inj_TyConst cs IsSequence
- ) => Read_TyNameR TyName cs (Proxy IsSequence ': rs) where
-       read_TyNameR _cs (TyName "IsSequence") k = k (ty @IsSequence)
-       read_TyNameR _rs raw k = read_TyNameR (Proxy @rs) raw k
-instance Show_TyConst cs => Show_TyConst (Proxy IsSequence ': cs) where
-       show_TyConst TyConstZ{} = "IsSequence"
-       show_TyConst (TyConstS c) = show_TyConst c
-
-instance Proj_TyConC cs (Proxy IsSequence)
-
-data instance TokenT meta (ts::[*]) (Proxy IsSequence)
- = Token_Term_IsSequence_filter (EToken meta ts) (EToken meta ts)
-deriving instance Eq_Token meta ts => Eq (TokenT meta ts (Proxy IsSequence))
-deriving instance Show_Token meta ts => Show (TokenT meta ts (Proxy IsSequence))
-
-instance -- CompileI
- ( Inj_TyConst cs IsSequence
- , Inj_TyConst cs (->)
- , Inj_TyConst cs Bool
- , Proj_TyCon  cs
- , Proj_TyFam  cs TyFam_MonoElement
- , Compile cs is
- ) => CompileI cs is (Proxy IsSequence) where
-       compileI
-        :: forall meta ctx ret ls rs.
-        TokenT meta is (Proxy IsSequence)
-        -> Compiler meta ctx ret cs is ls (Proxy IsSequence ': rs)
-       compileI tok ctx k =
-               case tok of
-                Token_Term_IsSequence_filter tok_e2Bool tok_s ->
-                       -- filter :: IsSequence s => (MT.Element s -> Bool) -> s -> s
-                       compile tok_e2Bool ctx $ \ty_e2Bool (Term e2Bool) ->
-                       compile tok_s      ctx $ \ty_s      (Term s) ->
-                       check_TyEq2 (ty @(->)) (At (Just tok_e2Bool) ty_e2Bool) $ \Refl ty_e2Bool_e ty_e2Bool_Bool ->
-                       check_TyEq
-                        (At Nothing (ty @Bool))
-                        (At (Just tok_e2Bool) ty_e2Bool_Bool) $ \Refl ->
-                       check_TyCon (At (Just tok_s) (ty @IsSequence :$ ty_s)) $ \TyCon ->
-                       check_TyFam (At (Just tok_s) TyFam_MonoElement) (ty_s `TypesS` TypesZ) $ \ty_s_e ->
-                       check_TyEq
-                        (At Nothing ty_s_e)
-                        (At (Just tok_e2Bool) ty_e2Bool_e) $ \Refl ->
-                       k ty_s $ Term $
-                        \c -> filter (e2Bool c) (s c)
-instance -- TokenizeT
- Inj_Token meta ts IsSequence =>
- TokenizeT meta ts (Proxy IsSequence) where
-       tokenizeT _t = mempty
-        { tokenizers_infix = tokenizeTMod []
-                [ tokenize2 "filter" infixN5 Token_Term_IsSequence_filter
-                ]
-        }
-instance Gram_Term_AtomsT meta ts (Proxy IsSequence) g
+       default filter :: Sym_IsSequence (UnT term) => Trans term => IsSequence s => term (MT.Element s -> Bool) -> term s -> term s
+       filter = trans2 filter
+
+-- Interpreting
+instance Sym_IsSequence Eval where
+       filter  = eval2 Seqs.filter
+instance Sym_IsSequence View where
+       filter  = view2 "filter"
+instance (Sym_IsSequence r1, Sym_IsSequence r2) => Sym_IsSequence (Dup r1 r2) where
+       filter  = dup2 @Sym_IsSequence filter
+
+-- Transforming
+instance (Sym_IsSequence term, Sym_Lambda term) => Sym_IsSequence (BetaT term)
+
+-- Typing
+instance NameTyOf IsSequence where
+       nameTyOf _c = ["IsSequence"] `Mod` "IsSequence"
+instance FixityOf IsSequence
+instance ClassInstancesFor IsSequence
+instance TypeInstancesFor IsSequence
+
+-- Compiling
+instance Gram_Term_AtomsFor src ss g IsSequence
+instance (Source src, SymInj ss IsSequence) => ModuleFor src ss IsSequence where
+       moduleFor = ["IsSequence"] `moduleWhere`
+        [ "filter" := teIsSequence_filter
+        ]
+
+-- ** 'Type's
+tyIsSequence :: Source src => Type src vs a -> Type src vs (IsSequence a)
+tyIsSequence a = tyConstLen @(K IsSequence) @IsSequence (lenVars a) `tyApp` a
+
+-- ** 'Term's
+teIsSequence_filter :: TermDef IsSequence '[Proxy s, Proxy e] (IsSequence s # e #~ MT.Element s #> ((e -> Bool) -> s -> s))
+teIsSequence_filter = Term (tyIsSequence s0 # e1 #~ famElement s0) ((e1 ~> tyBool) ~> s0 ~> s0) $ teSym @IsSequence $ lam2 filter