module Numeric.Data.NonZero
(
NonZero (MkNonZero),
mkNonZero,
mkNonZeroTH,
Internal.unsafeNonZero,
reallyUnsafeNonZero,
unNonZero,
_MkNonZero,
rmatching,
)
where
import Language.Haskell.TH (Code, Q)
import Language.Haskell.TH.Syntax (Lift (liftTyped))
import Numeric.Algebra (AMonoid, pattern NonZero, pattern Zero)
import Numeric.Data.Internal.Utils (rmatching)
import Numeric.Data.NonZero.Internal (NonZero (MkNonZero, UnsafeNonZero))
import Numeric.Data.NonZero.Internal qualified as Internal
import Optics.Core (ReversedPrism', prism, re)
unNonZero :: NonZero a -> a
unNonZero :: forall a. NonZero a -> a
unNonZero (UnsafeNonZero a
x) = a
x
mkNonZero :: (AMonoid a, Eq a) => a -> Maybe (NonZero a)
mkNonZero :: forall a. (AMonoid a, Eq a) => a -> Maybe (NonZero a)
mkNonZero a
Zero = Maybe (NonZero a)
forall a. Maybe a
Nothing
mkNonZero (NonZero a
x) = NonZero a -> Maybe (NonZero a)
forall a. a -> Maybe a
Just (a -> NonZero a
forall a. a -> NonZero a
UnsafeNonZero a
x)
{-# INLINEABLE mkNonZero #-}
mkNonZeroTH :: (AMonoid a, Eq a, Lift a) => a -> Code Q (NonZero a)
mkNonZeroTH :: forall a. (AMonoid a, Eq a, Lift a) => a -> Code Q (NonZero a)
mkNonZeroTH a
Zero = [Char] -> Code Q (NonZero a)
forall a. HasCallStack => [Char] -> a
error ([Char] -> Code Q (NonZero a)) -> [Char] -> Code Q (NonZero a)
forall a b. (a -> b) -> a -> b
$ [Char] -> [Char]
Internal.errMsg [Char]
"mkNonZeroTH"
mkNonZeroTH (NonZero a
x) = NonZero a -> Code Q (NonZero a)
forall t (m :: Type -> Type). (Lift t, Quote m) => t -> Code m t
forall (m :: Type -> Type).
Quote m =>
NonZero a -> Code m (NonZero a)
liftTyped (a -> NonZero a
forall a. a -> NonZero a
UnsafeNonZero a
x)
{-# INLINEABLE mkNonZeroTH #-}
reallyUnsafeNonZero :: a -> NonZero a
reallyUnsafeNonZero :: forall a. a -> NonZero a
reallyUnsafeNonZero = a -> NonZero a
forall a. a -> NonZero a
UnsafeNonZero
{-# INLINE reallyUnsafeNonZero #-}
_MkNonZero :: (AMonoid a, Eq a) => ReversedPrism' (NonZero a) a
_MkNonZero :: forall a. (AMonoid a, Eq a) => ReversedPrism' (NonZero a) a
_MkNonZero = Optic A_Prism NoIx a a (NonZero a) (NonZero a)
-> Optic (ReversedOptic A_Prism) NoIx (NonZero a) (NonZero a) a a
forall (is :: IxList) s t a b.
AcceptsEmptyIndices "re" is =>
Optic A_Prism is s t a b
-> Optic (ReversedOptic A_Prism) is b a t s
forall k (is :: IxList) s t a b.
(ReversibleOptic k, AcceptsEmptyIndices "re" is) =>
Optic k is s t a b -> Optic (ReversedOptic k) is b a t s
re ((NonZero a -> a)
-> (a -> Either a (NonZero a))
-> Optic A_Prism NoIx a a (NonZero a) (NonZero a)
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism NonZero a -> a
forall a. NonZero a -> a
f a -> Either a (NonZero a)
forall {a}. (AMonoid a, Eq a) => a -> Either a (NonZero a)
g)
where
f :: NonZero a -> a
f = NonZero a -> a
forall a. NonZero a -> a
unNonZero
g :: a -> Either a (NonZero a)
g a
x = case a -> Maybe (NonZero a)
forall a. (AMonoid a, Eq a) => a -> Maybe (NonZero a)
mkNonZero a
x of
Maybe (NonZero a)
Nothing -> a -> Either a (NonZero a)
forall a b. a -> Either a b
Left a
x
Just NonZero a
x' -> NonZero a -> Either a (NonZero a)
forall a b. b -> Either a b
Right NonZero a
x'
{-# INLINEABLE _MkNonZero #-}