module Numeric.Data.NonZero
(
NonZero (MkNonZero),
mkNonZero,
mkNonZeroTH,
Internal.unsafeNonZero,
reallyUnsafeNonZero,
unNonZero,
_MkNonZero,
rmatching,
)
where
import Data.Bifunctor (Bifunctor (first))
import Language.Haskell.TH (Code, Q)
import Language.Haskell.TH.Syntax (Lift)
import Numeric.Algebra (AMonoid, pattern NonZero, pattern Zero)
import Numeric.Data.Internal.Utils (rmatching)
import Numeric.Data.Internal.Utils qualified as Utils
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 -> Either String (NonZero a)
mkNonZero :: forall a. (AMonoid a, Eq a) => a -> Either String (NonZero a)
mkNonZero a
Zero = String -> Either String (NonZero a)
forall a b. a -> Either a b
Left String
Internal.errMsg
mkNonZero (NonZero a
x) = NonZero a -> Either String (NonZero a)
forall a b. b -> Either a b
Right (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 = Either String (NonZero a) -> Code Q (NonZero a)
forall a. Lift a => Either String a -> Code Q a
Utils.liftErrorTH (Either String (NonZero a) -> Code Q (NonZero a))
-> (a -> Either String (NonZero a)) -> a -> Code Q (NonZero a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Either String (NonZero a)
forall a. (AMonoid a, Eq a) => a -> Either String (NonZero a)
mkNonZero
{-# 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
unNonZero a -> Either a (NonZero a)
forall {b}. (AMonoid b, Eq b) => b -> Either b (NonZero b)
g)
where
g :: b -> Either b (NonZero b)
g b
x = (String -> b) -> Either String (NonZero b) -> Either b (NonZero b)
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: Type -> Type -> Type) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (b -> String -> b
forall a b. a -> b -> a
const b
x) (Either String (NonZero b) -> Either b (NonZero b))
-> (b -> Either String (NonZero b)) -> b -> Either b (NonZero b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> Either String (NonZero b)
forall a. (AMonoid a, Eq a) => a -> Either String (NonZero a)
mkNonZero (b -> Either b (NonZero b)) -> b -> Either b (NonZero b)
forall a b. (a -> b) -> a -> b
$ b
x
{-# INLINEABLE _MkNonZero #-}