Safe Haskell | None |
---|---|
Language | Haskell2010 |
Provides the NonZero
type for enforcing a non-zero invariant.
Since: 0.1
Synopsis
- data NonZero a where
- mkNonZero :: (Eq a, Num a) => a -> Maybe (NonZero a)
- mkNonZeroTH :: (Eq a, Lift a, Num a) => a -> Code Q (NonZero a)
- unsafeNonZero :: (Eq a, HasCallStack, Num a) => a -> NonZero a
- reallyUnsafeNonZero :: a -> NonZero a
- unNonZero :: NonZero a -> a
- _MkNonZero :: (Eq a, Num a) => ReversedPrism' (NonZero a) a
- rmatching :: (Is (ReversedOptic k) An_AffineTraversal, ReversibleOptic k) => Optic k NoIx b a t s -> s -> Either t a
Type
Smart-constructor for creating a "non-zero" a
.
Since: 0.1
pattern MkNonZero :: a -> NonZero a | Unidirectional pattern synonym for Since: 0.1 |
Instances
Creation
mkNonZero :: (Eq a, Num a) => a -> Maybe (NonZero a) Source #
Smart constructor for NonZero
.
Examples
>>>
mkNonZero 7
Just (UnsafeNonZero 7)
>>>
mkNonZero 0
Nothing
Since: 0.1
unsafeNonZero :: (Eq a, HasCallStack, Num a) => a -> NonZero a Source #
Throws an error when given 0.
WARNING: Partial
Examples
>>>
unsafeNonZero 7
UnsafeNonZero 7
Since: 0.1
reallyUnsafeNonZero :: a -> NonZero a Source #
This function is an alias for the unchecked constructor UnsafeNonZero
i.e. it allows us to construct a NonZero
without checking the
invariant. This is intended only for when we absolutely know the invariant
holds and a branch (i.e. unsafeNonZero
) is undesirable for
performance reasons. Exercise extreme caution.
Since: 0.1
Elimination
Optics
We provide a ReversedPrism'
_MkNonZero
that allows for total
elimination and partial construction, along with a LabelOptic
Getter
for #unNonZero
.
Examples
>>>
:set -XOverloadedLabels
>>>
import Optics.Core (view)
>>>
let n = $$(mkNonZeroTH 7)
>>>
view #unNonZero n
7
_MkNonZero :: (Eq a, Num a) => ReversedPrism' (NonZero a) a Source #
ReversedPrism'
that enables total elimination and partial construction.
Examples
>>>
import Optics.Core (view)
>>>
nz = $$(mkNonZeroTH 7)
>>>
view _MkNonZero nz
7
>>>
rmatching _MkNonZero 3
Right (UnsafeNonZero 3)
>>>
rmatching _MkNonZero 0
Left 0
Since: 0.1
rmatching :: (Is (ReversedOptic k) An_AffineTraversal, ReversibleOptic k) => Optic k NoIx b a t s -> s -> Either t a Source #
Reversed matching
. Useful with smart-constructor optics.
Since: 0.1