Îõ³h,i ô>      !"#$%&'()*+,-./0123456789:;<=0.1.0.0None 9?ÀÁËÒÕä ½> th-deepstrict,May contain variables bound by datatype args? th-deepstrict)either the index of the field or the name@ th-deepstrict†A function/constructor is weak strict either iff it is strict and the argument isn't unlifted So, it is like strictness but functionsconstructors with unlifted newtype args are WeakLazy See: 1https://gitlab.haskell.org/ghc/ghc/-/issues/21380 th-deepstrict”Whether a type is used strictly by a data type. We use these to annotate types with deep strictness overrides. Types that have fields labelled as Ì require those types to be deep strict. Types that have fields labelled as Ç will never be deep strict, but this can be helpful for nicer messages. th-deepstrict+Reasons why a type fails to be deep strict. th-deepstrictThe type is lazy. th-deepstrict The type has a lazy constructor. th-deepstrict=One of the fields of the constructor fails to be deep strict. th-deepstrictÁOne of the fields of the constructor is lazy, ie, doesn't have a !.  th-deepstrict:A type is deep strict if and only if for each constructor:.All of its fields are strict, ie, they have a ! if possible.)The type of of each field is deep strict.ÖThe Monoid instance allows us to gather up reasons why a type fails to be deep strict.Examples()æ is deep strict because its single constructor doesn't have any fields so it is vacuously deep strict.A, BÞ, etc are all deep strict because they are wrappers around unlifted types that cannot be lazy. Maybe Int is not deep strict. It has a C' constructor, which is fine. But, the DÀ constructor has a lazy field, which means it's not deep strict. th-deepstrictÓAllow overriding various setting that determine what types we consider deep strict. th-deepstrict*A recursion depth to avoid infinite loops. th-deepstrictèMaps names of types to whether they can be deep strict and if they can which arguments need to be strict th-deepstrictâThe types we are recursively checking. By the inductive hypothesis, we assume they are DeepStrict. th-deepstrict The default .E th-deepstrictprecondtion: name is a typeF th-deepstrict¸Figure out the levity of a type from its kind. If it has type arguments the kind will have arrows, we want to know the final return type. Eg, for (x -> (y -> z)), we care about zG th-deepstrictíFigure out the field names for a constructor. We have names for records, we use indices for everything else.H th-deepstrict?Is this type constructor applied to these arguments deep strict th-deepstrictàDetermine if a type is deep strict Invariant: The type doesn't contain any free variables, eg, Maybe a will fail. th-deepstrict÷Assert that a type is deep strict. If the type isn't deep strict then this will produce an error with the reasons why.     É      !"#$%&'()*+,-./0123456789:;<=>?@?ABCDECDFGHIGHJKLMNÏth-deepstrict-0.1.0.0-inplaceLanguage.Haskell.TH.DeepStrict th-deepstrictStrictLazyFieldKey StrictnessDeepStrictReasonLazyTypeLazyConstructor FieldReason LazyField LazyOtherDeepStrictWithReason DeepStrict NotDeepStrictContextcontextRecursionDepthcontextOverride contextCache contextSpine emptyContext isDeepStrictisDeepStrictWithassertDeepStrictassertDeepStrictWith$fPprDeepStrict$fMonoidDeepStrict$fSemigroupDeepStrict$fPprDeepStrictReason$fPprDeepStrictAssertionFailed $fEqFieldInfo$fOrdFieldInfo$fShowFieldInfo$fFunctorDeepStrictM$fApplicativeDeepStrictM$fMonadDeepStrictM$fMonadIODeepStrictM$fMonadFailDeepStrictM$fMonadReaderContextDeepStrictM$fQuoteDeepStrictM$fQuasiDeepStrictM$fEqDeepStrictReason$fOrdDeepStrictReason$fShowDeepStrictReason$fLiftBoxedRepDeepStrictReason $fEqHasBang $fOrdHasBang $fShowHasBang$fEqWeakStrictness$fOrdWeakStrictness$fShowWeakStrictness$fEqStrictness$fOrdStrictness$fShowStrictness $fEqLevity $fOrdLevity $fShowLevity$fEqDeepStrict$fOrdDeepStrict$fShowDeepStrict$fLiftBoxedRepDeepStrict$fFunctorDeepStrict FieldInfo fieldInfoType fieldInfoNameWeakStrictnessghc-prim GHC.TypesIntCharbase GHC.MaybeNothingJustreifyLevityNameclassifyKindLevityextractFieldNamesisNameDeepStrict