Safe Haskell | None |
---|---|
Language | GHC2021 |
Strongweak.Chain
Synopsis
- newtype SWChain (n :: Natural) a = SWChain {
- unSWChain :: a
- strengthenN :: StrengthenN n a => WeakenedN n a -> Either StrengthenFailure' a
Documentation
newtype SWChain (n :: Natural) a Source #
When weakening (or strengthening), chain the operation n
times.
You may achieve this without extra newtypes by nesting uses of
SW
. However, strongweak generics can't handle this,
forcing you to write manual instances.
SWChain
provides this nesting behaviour in a type. In return for adding a
boring newtype layer to the strong representation, you can chain weakening and
strengthenings without having to write them manually.
The type works as follows:
Weakened
(SWChain
0 a) = aWeakened
(SWChain
1 a) =Weakened
aWeakened
(SWChain
2 a) =Weakened
(Weakened
a)Weakened
(SWChain
n a) =WeakenedN
n a
And so on. (This type is only much use from n = 2
onwards.)
You may also use this as a "via" type:
newtype A (s ::Strength
) = A { a1 ::SW
s (Identity (SW
s Word8)) } deriving viaSWChain
2 (Identity Word8) instanceWeaken
(AStrong
) deriving viaSWChain
2 (Identity Word8) instanceStrengthen
(AStrong
)
Instances
Show a => Show (SWChain n a) Source # | |
Eq a => Eq (SWChain n a) Source # | |
Ord a => Ord (SWChain n a) Source # | |
Defined in Strongweak.Chain | |
StrengthenN n a => Strengthen (SWChain n a) Source # | |
Defined in Strongweak.Chain Methods strengthen :: Weakened (SWChain n a) -> Either StrengthenFailure' (SWChain n a) Source # | |
WeakenN n a => Weaken (SWChain n a) Source # | |
type Weakened (SWChain n a) Source # | |
Defined in Strongweak.Chain |
strengthenN :: StrengthenN n a => WeakenedN n a -> Either StrengthenFailure' a Source #