strongweak-0.10.0: Convert between strong and weak representations of types
Safe HaskellNone
LanguageGHC2021

Strongweak.Weaken

Synopsis

Weaken class

class Weaken a where Source #

Weaken some a, relaxing certain invariants.

See Strongweak for class design notes and laws.

Associated Types

type Weakened a Source #

The weakened type for some type.

Methods

weaken :: a -> Weakened a Source #

Weaken some a to its associated weak type Weakened a.

Instances

Instances details
Weaken Int16 Source # 
Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened Int16 
Instance details

Defined in Strongweak.Weaken

Weaken Int32 Source # 
Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened Int32 
Instance details

Defined in Strongweak.Weaken

Weaken Int64 Source # 
Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened Int64 
Instance details

Defined in Strongweak.Weaken

Weaken Int8 Source # 
Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened Int8 
Instance details

Defined in Strongweak.Weaken

Weaken Word16 Source # 
Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened Word16 
Instance details

Defined in Strongweak.Weaken

Weaken Word32 Source # 
Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened Word32 
Instance details

Defined in Strongweak.Weaken

Weaken Word64 Source # 
Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened Word64 
Instance details

Defined in Strongweak.Weaken

Weaken Word8 Source # 
Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened Word8 
Instance details

Defined in Strongweak.Weaken

Weaken (Identity a) Source #

Strip wrapper.

Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened (Identity a) 
Instance details

Defined in Strongweak.Weaken

type Weakened (Identity a) = a
Weaken (NonEmpty a) Source #

Weaken non-empty lists into plain lists.

Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened (NonEmpty a) 
Instance details

Defined in Strongweak.Weaken

type Weakened (NonEmpty a) = [a]
Weaken a => Weaken [a] Source #

Decomposer. Weaken every element in a list.

Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened [a] 
Instance details

Defined in Strongweak.Weaken

type Weakened [a] = [Weakened a]

Methods

weaken :: [a] -> Weakened [a] Source #

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

Decomposer. Weaken either side of an Either.

Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened (Either a b) 
Instance details

Defined in Strongweak.Weaken

type Weakened (Either a b) = Either (Weakened a) (Weakened b)

Methods

weaken :: Either a b -> Weakened (Either a b) Source #

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

Defined in Strongweak.Generic

Associated Types

type Weakened (GenericallySW s w) 
Instance details

Defined in Strongweak.Generic

type Weakened (GenericallySW s w) = w
(Weaken a, Weaken b) => Weaken (a, b) Source #

Decomposer. Weaken both elements of a tuple.

Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened (a, b) 
Instance details

Defined in Strongweak.Weaken

type Weakened (a, b) = (Weakened a, Weakened b)

Methods

weaken :: (a, b) -> Weakened (a, b) Source #

Weaken (Const a b) Source #

Strip wrapper.

Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened (Const a b) 
Instance details

Defined in Strongweak.Weaken

type Weakened (Const a b) = a

Methods

weaken :: Const a b -> Weakened (Const a b) Source #

Weaken (Refined p a) Source #

Strip refined type refinement.

Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened (Refined p a) 
Instance details

Defined in Strongweak.Weaken

type Weakened (Refined p a) = a

Methods

weaken :: Refined p a -> Weakened (Refined p a) Source #

Vector v a => Weaken (Vector v n a) Source #

Weaken sized vectors into plain lists.

Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened (Vector v n a) 
Instance details

Defined in Strongweak.Weaken

type Weakened (Vector v n a) = [a]

Methods

weaken :: Vector v n a -> Weakened (Vector v n a) Source #

Weaken (Refined1 p f a) Source #

Strip refined functor type refinement.

Instance details

Defined in Strongweak.Weaken

Associated Types

type Weakened (Refined1 p f a) 
Instance details

Defined in Strongweak.Weaken

type Weakened (Refined1 p f a) = f a

Methods

weaken :: Refined1 p f a -> Weakened (Refined1 p f a) Source #

liftWeakF :: Weaken a => (Weakened a -> b) -> a -> b Source #

Lift a function on a weak type to the associated strong type by weakening first.

Strength switch helper

data Strength Source #

Strength enumeration: is it strong, or weak?

Primarily interesting at the type level (using DataKinds).

Constructors

Strong 
Weak 

type family SW (s :: Strength) a where ... Source #

Get either the strong or weak representation of a type, depending on the type-level "switch" provided.

This is intended to be used in data types that take a Strength type. Define your type using strong fields wrapped in SW s. You then get the weak representation for free, using the same definition.

data A (s :: Strength) = A
  { a1 :: SW s Word8
  , a2 :: String }

Equations

SW 'Strong a = a 
SW 'Weak a = Weakened a 

type family SWDepth (n :: Natural) a where ... Source #

Track multiple levels of weakening. Silly thought I had, don't think it's useful.

Equations

SWDepth 0 a = a 
SWDepth n a = Weakened (SWDepth (n - 1) a)