Add colorable and decorable.
[haskell/symantic.git] / symantic-lib / Language / Symantic / Lib / NonNull.hs
index 813b72bdae8fffddf10869581c2fbcb03aa94f8d..1f8753c6b16d7a2b406beeb3a6aff06d6507f519 100644 (file)
 {-# LANGUAGE UndecidableInstances #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
-{-# OPTIONS_GHC -fconstraint-solver-iterations=9 #-}
 -- | Symantic for 'NonNull'.
 module Language.Symantic.Lib.NonNull where
 
-import Control.Monad (liftM, liftM2)
 import Data.MonoTraversable (MonoFoldable)
-import qualified Data.MonoTraversable as MT
 import Data.NonNull (NonNull)
-import qualified Data.NonNull as NonNull
-import Data.Proxy
 import Data.Sequences (IsSequence, SemiSequence)
-import Data.Type.Equality ((:~:)(Refl))
 import Prelude hiding (head, init, last, tail)
+import qualified Data.MonoTraversable as MT
+import qualified Data.NonNull as NonNull
 
-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
+import Language.Symantic
+import Language.Symantic.Lib.Bool (tyBool)
+import Language.Symantic.Lib.Maybe (tyMaybe)
+import Language.Symantic.Lib.MonoFoldable (tyMonoFoldable)
+import Language.Symantic.Lib.MonoFunctor (Element, famElement, o0, e1)
+import Language.Symantic.Lib.Sequences (tySemiSequence, tyIsSequence, s0)
+import Language.Symantic.Lib.Tuple2 (tyTuple2)
 
 -- * Class 'Sym_NonNull'
+type instance Sym NonNull = Sym_NonNull
 class Sym_NonNull term where
        fromNullable :: MonoFoldable o => term o -> term (Maybe (NonNull o))
-       toNullable :: MonoFoldable o => term (NonNull o) -> term o
-       ncons :: SemiSequence s => term (MT.Element s) -> term s -> term (NonNull s)
-       nuncons :: IsSequence s => term (NonNull s) -> term (MT.Element s, Maybe (NonNull s))
-       head :: MonoFoldable o => term (NonNull o) -> term (MT.Element o)
-       last :: MonoFoldable o => term (NonNull o) -> term (MT.Element o)
-       tail :: IsSequence s => term (NonNull s) -> term s
-       init :: IsSequence s => term (NonNull s) -> term s
-       nfilter :: IsSequence s => term (MT.Element s -> Bool) -> term (NonNull s) -> term s
-       default fromNullable :: (Trans t term, MonoFoldable o) => t term o -> t term (Maybe (NonNull o))
-       default toNullable :: (Trans t term, MonoFoldable o) => t term (NonNull o) -> t term o
-       default ncons :: (Trans t term, SemiSequence s) => t term (MT.Element s) -> t term s -> t term (NonNull s)
-       default nuncons :: (Trans t term, IsSequence s) => t term (NonNull s) -> t term (MT.Element s, Maybe (NonNull s))
-       default head :: (Trans t term, MonoFoldable o) => t term (NonNull o) -> t term (MT.Element o)
-       default last :: (Trans t term, MonoFoldable o) => t term (NonNull o) -> t term (MT.Element o)
-       default tail :: (Trans t term, IsSequence s) => t term (NonNull s) -> t term s
-       default init :: (Trans t term, IsSequence s) => t term (NonNull s) -> t term s
-       default nfilter :: (Trans t term, IsSequence s) => t term (MT.Element s -> Bool) -> t term (NonNull s) -> t term s
-       fromNullable = trans_map1 fromNullable
-       toNullable   = trans_map1 toNullable
-       ncons        = trans_map2 ncons
-       nuncons      = trans_map1 nuncons
-       head         = trans_map1 head
-       last         = trans_map1 last
-       tail         = trans_map1 tail
-       init         = trans_map1 init
-       nfilter      = trans_map2 nfilter
+       toNullable   :: MonoFoldable o => term (NonNull o) -> term o
+       ncons        :: SemiSequence s => term (MT.Element s) -> term s -> term (NonNull s)
+       nuncons      :: IsSequence s   => term (NonNull s) -> term (MT.Element s, Maybe (NonNull s))
+       head         :: MonoFoldable o => term (NonNull o) -> term (MT.Element o)
+       last         :: MonoFoldable o => term (NonNull o) -> term (MT.Element o)
+       tail         :: IsSequence s   => term (NonNull s) -> term s
+       init         :: IsSequence s   => term (NonNull s) -> term s
+       nfilter      :: IsSequence s   => term (MT.Element s -> Bool) -> term (NonNull s) -> term s
+       default fromNullable :: Sym_NonNull (UnT term) => Trans term => MonoFoldable o => term o -> term (Maybe (NonNull o))
+       default toNullable   :: Sym_NonNull (UnT term) => Trans term => MonoFoldable o => term (NonNull o) -> term o
+       default ncons        :: Sym_NonNull (UnT term) => Trans term => SemiSequence s => term (MT.Element s) -> term s -> term (NonNull s)
+       default nuncons      :: Sym_NonNull (UnT term) => Trans term => IsSequence s   => term (NonNull s) -> term (MT.Element s, Maybe (NonNull s))
+       default head         :: Sym_NonNull (UnT term) => Trans term => MonoFoldable o => term (NonNull o) -> term (MT.Element o)
+       default last         :: Sym_NonNull (UnT term) => Trans term => MonoFoldable o => term (NonNull o) -> term (MT.Element o)
+       default tail         :: Sym_NonNull (UnT term) => Trans term => IsSequence s   => term (NonNull s) -> term s
+       default init         :: Sym_NonNull (UnT term) => Trans term => IsSequence s   => term (NonNull s) -> term s
+       default nfilter      :: Sym_NonNull (UnT term) => Trans term => IsSequence s   => term (MT.Element s -> Bool) -> term (NonNull s) -> term s
+       fromNullable = trans1 fromNullable
+       toNullable   = trans1 toNullable
+       ncons        = trans2 ncons
+       nuncons      = trans1 nuncons
+       head         = trans1 head
+       last         = trans1 last
+       tail         = trans1 tail
+       init         = trans1 init
+       nfilter      = trans2 nfilter
 
-type instance Sym_of_Iface (Proxy NonNull) = Sym_NonNull
-type instance TyConsts_of_Iface (Proxy NonNull) = Proxy NonNull ': TyConsts_imported_by NonNull
-type instance TyConsts_imported_by NonNull =
- [ Proxy (->)
- , Proxy (,)
- , Proxy Eq
- , Proxy Maybe
- , Proxy Ord
- , Proxy MT.MonoFoldable
- , Proxy MT.MonoFunctor
- , Proxy IsSequence
- , Proxy SemiSequence
- , Proxy Show
- ]
+-- Interpreting
+instance Sym_NonNull Eval where
+       fromNullable = eval1 NonNull.fromNullable
+       toNullable   = eval1 NonNull.toNullable
+       ncons        = eval2 NonNull.ncons
+       nuncons      = eval1 NonNull.nuncons
+       head         = eval1 NonNull.head
+       last         = eval1 NonNull.last
+       tail         = eval1 NonNull.tail
+       init         = eval1 NonNull.init
+       nfilter      = eval2 NonNull.nfilter
+instance Sym_NonNull View where
+       fromNullable = view1 "fromNullable"
+       toNullable   = view1 "toNullable"
+       ncons        = view2 "ncons"
+       nuncons      = view1 "nuncons"
+       head         = view1 "head"
+       last         = view1 "last"
+       tail         = view1 "tail"
+       init         = view1 "init"
+       nfilter      = view2 "nfilter"
+instance (Sym_NonNull r1, Sym_NonNull r2) => Sym_NonNull (Dup r1 r2) where
+       fromNullable = dup1 @Sym_NonNull fromNullable
+       toNullable   = dup1 @Sym_NonNull toNullable
+       ncons        = dup2 @Sym_NonNull ncons
+       nuncons      = dup1 @Sym_NonNull nuncons
+       head         = dup1 @Sym_NonNull head
+       last         = dup1 @Sym_NonNull last
+       tail         = dup1 @Sym_NonNull tail
+       init         = dup1 @Sym_NonNull init
+       nfilter      = dup2 @Sym_NonNull nfilter
 
-instance Sym_NonNull HostI where
-       fromNullable = liftM  NonNull.fromNullable
-       toNullable   = liftM  NonNull.toNullable
-       ncons        = liftM2 NonNull.ncons
-       nuncons      = liftM  NonNull.nuncons
-       head         = liftM  NonNull.head
-       last         = liftM  NonNull.last
-       tail         = liftM  NonNull.tail
-       init         = liftM  NonNull.init
-       nfilter      = liftM2 NonNull.nfilter
-instance Sym_NonNull TextI where
-       fromNullable = textI1 "fromNullable"
-       toNullable   = textI1 "toNullable"
-       ncons        = textI2 "ncons"
-       nuncons      = textI1 "nuncons"
-       head         = textI1 "head"
-       last         = textI1 "last"
-       tail         = textI1 "tail"
-       init         = textI1 "init"
-       nfilter      = textI2 "nfilter"
-instance (Sym_NonNull r1, Sym_NonNull r2) => Sym_NonNull (DupI r1 r2) where
-       fromNullable = dupI1 @Sym_NonNull fromNullable
-       toNullable   = dupI1 @Sym_NonNull toNullable
-       ncons        = dupI2 @Sym_NonNull ncons
-       nuncons      = dupI1 @Sym_NonNull nuncons
-       head         = dupI1 @Sym_NonNull head
-       last         = dupI1 @Sym_NonNull last
-       tail         = dupI1 @Sym_NonNull tail
-       init         = dupI1 @Sym_NonNull init
-       nfilter      = dupI2 @Sym_NonNull nfilter
+-- Transforming
+instance (Sym_NonNull term, Sym_Lambda term) => Sym_NonNull (BetaT term)
 
-instance
- ( Read_TyNameR TyName cs rs
- , Inj_TyConst cs NonNull
- ) => Read_TyNameR TyName cs (Proxy NonNull ': rs) where
-       read_TyNameR _cs (TyName "NonNull") k = k (ty @NonNull)
-       read_TyNameR _rs raw k = read_TyNameR (Proxy @rs) raw k
-instance Show_TyConst cs => Show_TyConst (Proxy NonNull ': cs) where
-       show_TyConst TyConstZ{} = "NonNull"
-       show_TyConst (TyConstS c) = show_TyConst c
-
-instance -- TyFam_MonoElement
- ( Proj_TyConst cs NonNull
- , Proj_TyFam cs TyFam_MonoElement
- ) => Proj_TyFamC cs TyFam_MonoElement NonNull where
-       proj_TyFamC _c _fam ((TyConst c :$ ty_o) `TypesS` TypesZ)
-        | Just Refl <- eq_skind (kind_of_TyConst c) (SKiType `SKiArrow` SKiType)
-        , Just Refl <- proj_TyConst c (Proxy @NonNull)
-        = proj_TyFam TyFam_MonoElement (ty_o `TypesS` TypesZ)
-       proj_TyFamC _c _fam _ty = Nothing
-instance -- Proj_TyConC
- ( Proj_TyConst cs NonNull
- , Proj_TyConsts cs (TyConsts_imported_by NonNull)
- , Proj_TyCon cs
- ) => Proj_TyConC cs (Proxy NonNull) where
-       proj_TyConC _ (t@(TyConst q) :$ (TyConst c :$ o))
-        | Just Refl <- eq_skind (kind_of_TyConst c) (SKiType `SKiArrow` SKiType)
-        , Just Refl <- proj_TyConst c (Proxy @NonNull)
+-- Typing
+instance NameTyOf NonNull where
+       nameTyOf _c = ["NonNull"] `Mod` "NonNull"
+instance FixityOf NonNull
+instance TypeInstancesFor NonNull where
+       expandFamFor c len f (z:@o `TypesS` TypesZ)
+        | Just HRefl <- proj_ConstKi @_ @Element f
+        , Just HRefl <- proj_ConstKiTy @_ @NonNull z
+        = expandFamFor c len f (o `TypesS` TypesZ)
+       expandFamFor _c _len _fam _as = Nothing
+instance ClassInstancesFor NonNull where
+       proveConstraintFor _ (tq@(TyConst _ _ q) :$ c:@o)
+        | Just HRefl <- proj_ConstKiTy @_ @NonNull c
         = case () of
-                _ | Just Refl <- proj_TyConst q (Proxy @Eq)
-                  , Just TyCon  <- proj_TyCon (t :$ o) -> Just TyCon
-                  | Just Refl <- proj_TyConst q (Proxy @MT.MonoFoldable)
-                  , Just TyCon  <- proj_TyCon (t :$ o) -> Just TyCon
-                  | Just Refl <- proj_TyConst q (Proxy @MT.MonoFunctor)
-                  , Just TyCon  <- proj_TyCon (t :$ o) -> Just TyCon
-                  | Just Refl <- proj_TyConst q (Proxy @Ord)
-                  , Just TyCon  <- proj_TyCon (t :$ o) -> Just TyCon
-                  | Just Refl <- proj_TyConst q (Proxy @SemiSequence)
-                  , Just TyCon  <- proj_TyCon (t :$ o) -> Just TyCon
-                  | Just Refl <- proj_TyConst q (Proxy @Show)
-                  , Just TyCon  <- proj_TyCon (t :$ o) -> Just TyCon
+                _ | Just Refl <- proj_Const @Eq q
+                  , Just Dict <- proveConstraint (tq`tyApp`o) -> Just Dict
+                  | Just Refl <- proj_Const @MT.MonoFoldable q
+                  , Just Dict <- proveConstraint (tq`tyApp`o) -> Just Dict
+                  | Just Refl <- proj_Const @MT.MonoFunctor q
+                  , Just Dict <- proveConstraint (tq`tyApp`o) -> Just Dict
+                  | Just Refl <- proj_Const @Ord q
+                  , Just Dict <- proveConstraint (tq`tyApp`o) -> Just Dict
+                  | Just Refl <- proj_Const @SemiSequence q
+                  , Just Dict <- proveConstraint (tq`tyApp`o) -> Just Dict
+                  | Just Refl <- proj_Const @Show q
+                  , Just Dict <- proveConstraint (tq`tyApp`o) -> Just Dict
                 _ -> Nothing
-       proj_TyConC _c _q = Nothing
-data instance TokenT meta (ts::[*]) (Proxy NonNull)
- = Token_Term_NonNull_fromNullable (EToken meta ts)
- | Token_Term_NonNull_toNullable   (EToken meta ts)
- | Token_Term_NonNull_ncons        (EToken meta ts) (EToken meta ts)
- | Token_Term_NonNull_nuncons      (EToken meta ts)
- | Token_Term_NonNull_head         (EToken meta ts)
- | Token_Term_NonNull_last         (EToken meta ts)
- | Token_Term_NonNull_tail         (EToken meta ts)
- | Token_Term_NonNull_init         (EToken meta ts)
- | Token_Term_NonNull_nfilter      (EToken meta ts) (EToken meta ts)
-deriving instance Eq_Token meta ts => Eq (TokenT meta ts (Proxy NonNull))
-deriving instance Show_Token meta ts => Show (TokenT meta ts (Proxy NonNull))
-instance -- CompileI
- ( Inj_TyConst cs NonNull
- , Inj_TyConst cs (->)
- , Inj_TyConst cs (,)
- , Inj_TyConst cs Bool
- , Inj_TyConst cs Maybe
- , Inj_TyConst cs MonoFoldable
- , Inj_TyConst cs IsSequence
- , Inj_TyConst cs SemiSequence
- , Proj_TyCon  cs
- , Proj_TyFam  cs TyFam_MonoElement
- , Compile cs is
- ) => CompileI cs is (Proxy NonNull) where
-       compileI
-        :: forall meta ctx ret ls rs.
-        TokenT meta is (Proxy NonNull)
-        -> CompileT meta ctx ret cs is ls (Proxy NonNull ': rs)
-       compileI tok ctx k =
-               case tok of
-                Token_Term_NonNull_fromNullable tok_o ->
-                       -- fromNullable :: MonoFoldable o => o -> Maybe (NonNull o)
-                       compileO tok_o ctx $ \ty_o (TermO o) ->
-                       check_TyCon (At (Just tok_o) (ty @MonoFoldable :$ ty_o)) $ \TyCon ->
-                       k (ty @Maybe :$ (ty @NonNull :$ ty_o)) $ TermO $
-                        \c -> fromNullable (o c)
-                Token_Term_NonNull_toNullable tok_n ->
-                       -- toNullable :: MonoFoldable o => NonNull o -> o
-                       compileO tok_n ctx $ \ty_n (TermO n) ->
-                       check_TyEq1 (ty @NonNull) (At (Just tok_n) ty_n) $ \Refl ty_o ->
-                       check_TyCon (At (Just tok_n) (ty @MonoFoldable :$ ty_o)) $ \TyCon ->
-                       k ty_o $ TermO $
-                        \c -> toNullable (n c)
-                Token_Term_NonNull_ncons tok_e tok_s ->
-                       -- ncons :: SemiSequence s => MT.Element s -> s -> NonNull s
-                       compileO tok_e ctx $ \ty_e (TermO e) ->
-                       compileO tok_s ctx $ \ty_s (TermO 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 @NonNull :$ ty_s) $ TermO $
-                        \c -> ncons (e c) (s c)
-                Token_Term_NonNull_nuncons tok_n ->
-                       -- nuncons :: IsSequence s => NonNull s -> (MT.Element s, Maybe (NonNull s))
-                       compileO tok_n ctx $ \ty_n (TermO n) ->
-                       check_TyEq1 (ty @NonNull) (At (Just tok_n) ty_n) $ \Refl ty_s ->
-                       check_TyCon (At (Just tok_n) (ty @IsSequence :$ ty_s)) $ \TyCon ->
-                       check_TyFam (At (Just tok_n) TyFam_MonoElement) (ty_s `TypesS` TypesZ) $ \ty_s_e ->
-                       check_TyEq
-                        (At Nothing ty_s_e)
-                        (At (Just tok_n) ty_s_e) $ \Refl ->
-                       k (ty @(,) :$ ty_s_e :$ (ty @Maybe :$ (ty @NonNull :$ ty_s))) $ TermO $
-                        \c -> nuncons (n c)
-                Token_Term_NonNull_head tok_n -> n2e_from tok_n head
-                Token_Term_NonNull_last tok_n -> n2e_from tok_n last
-                Token_Term_NonNull_tail tok_n -> n2s_from tok_n tail
-                Token_Term_NonNull_init tok_n -> n2s_from tok_n init
-                Token_Term_NonNull_nfilter tok_e2Bool tok_n ->
-                       -- filter :: IsSequence s => (MT.Element s -> Bool) -> NonNull s -> s
-                       compileO tok_e2Bool ctx $ \ty_e2Bool (TermO e2Bool) ->
-                       compileO tok_n      ctx $ \ty_n      (TermO 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_TyEq1 (ty @NonNull) (At (Just tok_n) ty_n) $ \Refl ty_s ->
-                       check_TyCon (At (Just tok_n) (ty @IsSequence :$ ty_s)) $ \TyCon ->
-                       check_TyFam (At (Just tok_n) 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 $ TermO $
-                        \c -> nfilter (e2Bool c) (s c)
-               where
-               n2e_from tok_n
-                (f::forall term o.
-                        (Sym_NonNull term, MonoFoldable o)
-                        => term (NonNull o) -> term (MT.Element o)) =
-                -- head :: MonoFoldable o => NonNull o -> MT.Element o
-                -- last :: MonoFoldable o => NonNull o -> MT.Element o
-                       compileO tok_n ctx $ \ty_n (TermO n) ->
-                       check_TyEq1 (ty @NonNull) (At (Just tok_n) ty_n) $ \Refl ty_o ->
-                       check_TyCon (At (Just tok_n) (ty @MonoFoldable :$ ty_o)) $ \TyCon ->
-                       check_TyFam (At (Just tok_n) TyFam_MonoElement) (ty_o `TypesS` TypesZ) $ \ty_o_e ->
-                       k ty_o_e $ TermO $
-                        \c -> f (n c)
-               n2s_from tok_n
-                (f::forall term s.
-                        (Sym_NonNull term, IsSequence s)
-                        => term (NonNull s) -> term s) =
-                -- tail :: IsSequence s => NonNull s -> s
-                -- init :: IsSequence s => NonNull s -> s
-                       compileO tok_n ctx $ \ty_n (TermO n) ->
-                       check_TyEq1 (ty @NonNull) (At (Just tok_n) ty_n) $ \Refl ty_s ->
-                       check_TyCon (At (Just tok_n) (ty @IsSequence :$ ty_s)) $ \TyCon ->
-                       k ty_s $ TermO $
-                        \c -> f (n c)
-instance -- TokenizeT
- Inj_Token meta ts NonNull =>
- TokenizeT meta ts (Proxy NonNull) where
-       tokenizeT _t = mempty
-        { tokenizers_infix = tokenizeTMod []
-                [ tokenize1 "fromNullable" infixN5 Token_Term_NonNull_fromNullable
-                , tokenize1 "toNullable"   infixN5 Token_Term_NonNull_toNullable
-                , tokenize2 "ncons"        infixN5 Token_Term_NonNull_ncons
-                , tokenize1 "nuncons"      infixN5 Token_Term_NonNull_nuncons
-                , tokenize1 "head"         infixN5 Token_Term_NonNull_head
-                , tokenize1 "last"         infixN5 Token_Term_NonNull_last
-                , tokenize1 "tail"         infixN5 Token_Term_NonNull_tail
-                , tokenize1 "init"         infixN5 Token_Term_NonNull_init
-                , tokenize2 "nfilter"      infixN5 Token_Term_NonNull_nfilter
-                ]
-        }
-instance Gram_Term_AtomsT meta ts (Proxy NonNull) g
+       proveConstraintFor _c _q = Nothing
+
+-- Compiling
+instance Gram_Term_AtomsFor src ss g NonNull
+instance (Source src, SymInj ss NonNull) => ModuleFor src ss NonNull where
+       moduleFor = ["NonNull"] `moduleWhere`
+        [ "fromNullable" := teNonNull_fromNullable
+        , "toNullable"   := teNonNull_toNullable
+        , "ncons"        := teNonNull_ncons
+        , "nuncons"      := teNonNull_nuncons
+        , "head"         := teNonNull_head
+        , "last"         := teNonNull_last
+        , "tail"         := teNonNull_tail
+        , "init"         := teNonNull_init
+        , "nfilter"      := teNonNull_nfilter
+        ]
+
+-- ** 'Type's
+tyNonNull :: Source src => Type src vs a -> Type src vs (NonNull a)
+tyNonNull a = tyConstLen @(K NonNull) @NonNull (lenVars a) `tyApp` a
+
+-- ** 'Term's
+teNonNull_fromNullable :: TermDef NonNull '[Proxy o] (MonoFoldable o #> (o -> Maybe (NonNull o)))
+teNonNull_fromNullable = Term (tyMonoFoldable o0) (o0 ~> tyMaybe (tyNonNull o0)) $ teSym @NonNull $ lam1 fromNullable
+
+teNonNull_toNullable :: TermDef NonNull '[Proxy o] (MonoFoldable o #> (NonNull o -> o))
+teNonNull_toNullable = Term (tyMonoFoldable o0) (tyNonNull o0 ~> o0) $ teSym @NonNull $ lam1 toNullable
+
+teNonNull_ncons :: TermDef NonNull '[Proxy s, Proxy e] (SemiSequence s # e #~ MT.Element s #> (e -> s -> NonNull s))
+teNonNull_ncons = Term (tySemiSequence s0 # e1 #~ famElement s0) (e1 ~> s0 ~> tyNonNull s0) $ teSym @NonNull $ lam2 ncons
+
+teNonNull_nuncons :: TermDef NonNull '[Proxy s, Proxy e] (IsSequence s # e #~ MT.Element s #> (NonNull s -> (e, Maybe (NonNull s))))
+teNonNull_nuncons = Term (tyIsSequence s0 # e1 #~ famElement s0) (tyNonNull s0 ~> e1 `tyTuple2` tyMaybe (tyNonNull s0)) $ teSym @NonNull $ lam1 nuncons
+
+teNonNull_nfilter :: TermDef NonNull '[Proxy s, Proxy e] (IsSequence s # e #~ MT.Element s #> ((e -> Bool) -> NonNull s -> s))
+teNonNull_nfilter = Term (tyIsSequence s0 # e1 #~ famElement s0) ((e1 ~> tyBool) ~> tyNonNull s0 ~> s0) $ teSym @NonNull $ lam2 nfilter
+
+teNonNull_head, teNonNull_last :: TermDef NonNull '[Proxy o, Proxy e] (MonoFoldable o # e #~ MT.Element o #> (NonNull o -> e))
+teNonNull_head = Term (tyMonoFoldable o0 # e1 #~ famElement o0) (tyNonNull o0 ~> e1) $ teSym @NonNull $ lam1 head
+teNonNull_last = Term (tyMonoFoldable o0 # e1 #~ famElement o0) (tyNonNull o0 ~> e1) $ teSym @NonNull $ lam1 head
+
+teNonNull_tail, teNonNull_init :: TermDef NonNull '[Proxy s] (IsSequence s #> (NonNull s -> s))
+teNonNull_tail = Term (tyIsSequence s0) (tyNonNull s0 ~> s0) $ teSym @NonNull $ lam1 tail
+teNonNull_init = Term (tyIsSequence s0) (tyNonNull s0 ~> s0) $ teSym @NonNull $ lam1 init