strongweak
Safe HaskellNone
LanguageGHC2021

Strongweak.Strengthen

Synopsis

Strengthen class

class Weaken a => Strengthen a where Source #

Attempt to strengthen some Weakened a, asserting certain invariants.

We take Weaken as a superclass in order to maintain strong/weak type pair consistency. We choose this dependency direction because we treat the strong type as the "canonical" one, so Weaken is the more natural (and straightforward) class to define. That does mean the instances for this class are a little confusingly worded. Alas.

See Strongweak for class design notes and laws.

Methods

strengthen :: Weakened a -> Either StrengthenFailure' a Source #

Attempt to strengthen some Weakened a to its associated strong type a.

Instances

Instances details
Strengthen Int16 Source # 
Instance details

Defined in Strongweak.Strengthen

Strengthen Int32 Source # 
Instance details

Defined in Strongweak.Strengthen

Strengthen Int64 Source # 
Instance details

Defined in Strongweak.Strengthen

Strengthen Int8 Source # 
Instance details

Defined in Strongweak.Strengthen

Strengthen Word16 Source # 
Instance details

Defined in Strongweak.Strengthen

Strengthen Word32 Source # 
Instance details

Defined in Strongweak.Strengthen

Strengthen Word64 Source # 
Instance details

Defined in Strongweak.Strengthen

Strengthen Word8 Source # 
Instance details

Defined in Strongweak.Strengthen

Strengthen (Identity a) Source # 
Instance details

Defined in Strongweak.Strengthen

Strengthen (NonEmpty a) Source #

Strengthen a plain list into a non-empty list by asserting non-emptiness.

Instance details

Defined in Strongweak.Strengthen

(Generic (f 'Strong), Generic (f 'Weak), GStrengthenD (Rep (f 'Weak)) (Rep (f 'Strong)), Weaken (GenericallySW0 f)) => Strengthen (GenericallySW0 f) Source # 
Instance details

Defined in Strongweak.Generic

Strengthen (SWCoercibly a) Source # 
Instance details

Defined in Strongweak.Strengthen

Strengthen a => Strengthen [a] Source #

Decomposer. Strengthen every element in a list.

Instance details

Defined in Strongweak.Strengthen

(Strengthen a, Strengthen b) => Strengthen (Either a b) Source #

Decomposer. Strengthen either side of an Either.

Instance details

Defined in Strongweak.Strengthen

StrengthenN n a => Strengthen (SWChain n a) Source # 
Instance details

Defined in Strongweak.Chain

(Generic s, Generic w, GStrengthenD (Rep w) (Rep s), Weaken (GenericallySW s w)) => Strengthen (GenericallySW s w) Source # 
Instance details

Defined in Strongweak.Generic

(Strengthen l, Strengthen r) => Strengthen (l, r) Source #

Decomposer. Strengthen both elements of a tuple.

Instance details

Defined in Strongweak.Strengthen

Strengthen (Const a b) Source # 
Instance details

Defined in Strongweak.Strengthen

Refine p a => Strengthen (Refined p a) Source #

Strengthen a type by refining it with a predicate.

Instance details

Defined in Strongweak.Strengthen

(Vector v a, KnownNat n) => Strengthen (Vector v n a) Source #

Strengthen a plain list into a sized vector by asserting length.

Instance details

Defined in Strongweak.Strengthen

Refine1 p f => Strengthen (Refined1 p f a) Source #

Strengthen a type by refining it with a functor predicate.

Instance details

Defined in Strongweak.Strengthen

restrengthen :: (Strengthen a, Weaken a) => a -> Either StrengthenFailure' a Source #

Weaken a strong value, then strengthen it again.

Potentially useful if you have previously used unsafeStrengthen and now wish to check the invariants. For example:

>>> restrengthen $ unsafeStrengthen @(Vector 2 Natural) [0]
Left ...

class WeakenN n a => StrengthenN (n :: Natural) a where Source #

Instances

Instances details
(Strengthen a, StrengthenN (n - 1) (Weakened a)) => StrengthenN n a Source # 
Instance details

Defined in Strongweak.Strengthen

StrengthenN 0 a Source # 
Instance details

Defined in Strongweak.Strengthen

Helpers

strengthenBounded :: forall m n. (Typeable n, Integral n, Typeable m, Integral m, Bounded m, FiniteBits m) => n -> Either StrengthenFailure' m Source #

Strengthen one numeric type into another.

n must be "wider" than m.

FiniteBits m is for error printing.

Strengthen failures

data StrengthenFailure text Source #

A failure encountered during strengthening.

Strengthening can involve multiple distinct checks. In such cases, you may record multiple failures in a single StrengthenFailure by placing them in the inner failure list and noting their meaning in the detail field.

Constructors

StrengthenFailure 

Fields

  • strengthenFailDetail :: [text]

    Detail on strengthen failure.

    We use a list here for the cases where you want multiple lines of detail. Separating with a newline would make prettifying later harder, so we delay.

    Note that this should probably never be empty. TODO consider NonEmpty, but fairly unimportant.

  • strengthenFailInner :: [(text, StrengthenFailure text)]

    Optional wrapped failures.

    The text type acts as an index. Its meaning depends on the failure in question, and should be explained in strengthenFailDetail.

Instances

Instances details
Show text => Show (StrengthenFailure text) Source # 
Instance details

Defined in Strongweak.Strengthen

failStrengthen1 :: [text] -> Either (StrengthenFailure text) a Source #

Shorthand for failing a strengthen with no inner failures.

failStrengthen :: [text] -> [(text, StrengthenFailure text)] -> Either (StrengthenFailure text) a Source #

Shorthand for failing a strengthen.

Re-exports

type family Weakened a Source #

The weakened type for some type.

Instances

Instances details
type Weakened Int16 Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened Int32 Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened Int64 Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened Int8 Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened Word16 Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened Word32 Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened Word64 Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened Word8 Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened (Identity a) Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened (NonEmpty a) Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened (NonEmpty a) = [a]
type Weakened (GenericallySW0 f) Source # 
Instance details

Defined in Strongweak.Generic

type Weakened (SWCoercibly a) Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened (SWCoercibly a) = a
type Weakened [a] Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened [a] = [Weakened a]
type Weakened (Either a b) Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened (Either a b) = Either (Weakened a) (Weakened b)
type Weakened (SWChain n a) Source # 
Instance details

Defined in Strongweak.Chain

type Weakened (SWChain n a) = WeakenedN n a
type Weakened (GenericallySW s w) Source # 
Instance details

Defined in Strongweak.Generic

type Weakened (GenericallySW s w) = w
type Weakened (a, b) Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened (a, b) = (Weakened a, Weakened b)
type Weakened (Const a b) Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened (Refined p a) Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened (Refined p a) = a
type Weakened (Vector v n a) Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened (Vector v n a) = [a]
type Weakened (Refined1 p f a) Source # 
Instance details

Defined in Strongweak.Weaken

type Weakened (Refined1 p f a) = f a