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.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 :: (Eq a, Num a) => a -> Maybe (NonZero a)
mkNonZero :: forall a. (Eq a, Num a) => a -> Maybe (NonZero a)
mkNonZero a
x
| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0 = Maybe (NonZero a)
forall a. Maybe a
Nothing
| Bool
otherwise = 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 :: (Eq a, Lift a, Num a) => a -> Code Q (NonZero a)
mkNonZeroTH :: forall a. (Eq a, Lift a, Num a) => a -> Code Q (NonZero a)
mkNonZeroTH a
x
| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0 = [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"
| Bool
otherwise = 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 :: (Eq a, Num a) => ReversedPrism' (NonZero a) a
_MkNonZero :: forall a. (Eq a, Num 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}. (Eq a, Num 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. (Eq a, Num 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 #-}