{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}

-- | Wrapped numhask instances, useful for derivingvia situations to quickly specifiy a numhask friendly numerical type.
module NumHask.Data.Wrapped
  ( Wrapped (..),
  )
where

import NumHask.Algebra.Action
import NumHask.Algebra.Additive
import NumHask.Algebra.Field
import NumHask.Algebra.Lattice
import NumHask.Algebra.Metric
import NumHask.Algebra.Multiplicative
import NumHask.Algebra.Ring
import NumHask.Data.Integral
import NumHask.Data.Rational
import Prelude qualified as P

-- | Wrapped numhask instances
newtype Wrapped a = Wrapped {forall a. Wrapped a -> a
unWrapped :: a}
  deriving
    ( Int -> Wrapped a -> ShowS
[Wrapped a] -> ShowS
Wrapped a -> String
(Int -> Wrapped a -> ShowS)
-> (Wrapped a -> String)
-> ([Wrapped a] -> ShowS)
-> Show (Wrapped a)
forall a. Show a => Int -> Wrapped a -> ShowS
forall a. Show a => [Wrapped a] -> ShowS
forall a. Show a => Wrapped a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Wrapped a -> ShowS
showsPrec :: Int -> Wrapped a -> ShowS
$cshow :: forall a. Show a => Wrapped a -> String
show :: Wrapped a -> String
$cshowList :: forall a. Show a => [Wrapped a] -> ShowS
showList :: [Wrapped a] -> ShowS
P.Show,
      Wrapped a -> Wrapped a -> Bool
(Wrapped a -> Wrapped a -> Bool)
-> (Wrapped a -> Wrapped a -> Bool) -> Eq (Wrapped a)
forall a. Eq a => Wrapped a -> Wrapped a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Wrapped a -> Wrapped a -> Bool
== :: Wrapped a -> Wrapped a -> Bool
$c/= :: forall a. Eq a => Wrapped a -> Wrapped a -> Bool
/= :: Wrapped a -> Wrapped a -> Bool
P.Eq,
      Eq (Wrapped a)
Eq (Wrapped a) =>
(Wrapped a -> Wrapped a -> Ordering)
-> (Wrapped a -> Wrapped a -> Bool)
-> (Wrapped a -> Wrapped a -> Bool)
-> (Wrapped a -> Wrapped a -> Bool)
-> (Wrapped a -> Wrapped a -> Bool)
-> (Wrapped a -> Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a -> Wrapped a)
-> Ord (Wrapped a)
Wrapped a -> Wrapped a -> Bool
Wrapped a -> Wrapped a -> Ordering
Wrapped a -> Wrapped a -> Wrapped a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Wrapped a)
forall a. Ord a => Wrapped a -> Wrapped a -> Bool
forall a. Ord a => Wrapped a -> Wrapped a -> Ordering
forall a. Ord a => Wrapped a -> Wrapped a -> Wrapped a
$ccompare :: forall a. Ord a => Wrapped a -> Wrapped a -> Ordering
compare :: Wrapped a -> Wrapped a -> Ordering
$c< :: forall a. Ord a => Wrapped a -> Wrapped a -> Bool
< :: Wrapped a -> Wrapped a -> Bool
$c<= :: forall a. Ord a => Wrapped a -> Wrapped a -> Bool
<= :: Wrapped a -> Wrapped a -> Bool
$c> :: forall a. Ord a => Wrapped a -> Wrapped a -> Bool
> :: Wrapped a -> Wrapped a -> Bool
$c>= :: forall a. Ord a => Wrapped a -> Wrapped a -> Bool
>= :: Wrapped a -> Wrapped a -> Bool
$cmax :: forall a. Ord a => Wrapped a -> Wrapped a -> Wrapped a
max :: Wrapped a -> Wrapped a -> Wrapped a
$cmin :: forall a. Ord a => Wrapped a -> Wrapped a -> Wrapped a
min :: Wrapped a -> Wrapped a -> Wrapped a
P.Ord,
      Wrapped a
Wrapped a -> Wrapped a -> Wrapped a
(Wrapped a -> Wrapped a -> Wrapped a)
-> Wrapped a -> Additive (Wrapped a)
forall a. Additive a => Wrapped a
forall a. Additive a => Wrapped a -> Wrapped a -> Wrapped a
forall a. (a -> a -> a) -> a -> Additive a
$c+ :: forall a. Additive a => Wrapped a -> Wrapped a -> Wrapped a
+ :: Wrapped a -> Wrapped a -> Wrapped a
$czero :: forall a. Additive a => Wrapped a
zero :: Wrapped a
Additive,
      Additive (Wrapped a)
Additive (Wrapped a) =>
(Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a -> Wrapped a) -> Subtractive (Wrapped a)
Wrapped a -> Wrapped a
Wrapped a -> Wrapped a -> Wrapped a
forall a. Subtractive a => Additive (Wrapped a)
forall a. Subtractive a => Wrapped a -> Wrapped a
forall a. Subtractive a => Wrapped a -> Wrapped a -> Wrapped a
forall a. Additive a => (a -> a) -> (a -> a -> a) -> Subtractive a
$cnegate :: forall a. Subtractive a => Wrapped a -> Wrapped a
negate :: Wrapped a -> Wrapped a
$c- :: forall a. Subtractive a => Wrapped a -> Wrapped a -> Wrapped a
- :: Wrapped a -> Wrapped a -> Wrapped a
Subtractive,
      Wrapped a
Wrapped a -> Wrapped a -> Wrapped a
(Wrapped a -> Wrapped a -> Wrapped a)
-> Wrapped a -> Multiplicative (Wrapped a)
forall a. Multiplicative a => Wrapped a
forall a. Multiplicative a => Wrapped a -> Wrapped a -> Wrapped a
forall a. (a -> a -> a) -> a -> Multiplicative a
$c* :: forall a. Multiplicative a => Wrapped a -> Wrapped a -> Wrapped a
* :: Wrapped a -> Wrapped a -> Wrapped a
$cone :: forall a. Multiplicative a => Wrapped a
one :: Wrapped a
Multiplicative,
      Multiplicative (Wrapped a)
Multiplicative (Wrapped a) =>
(Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a -> Wrapped a) -> Divisive (Wrapped a)
Wrapped a -> Wrapped a
Wrapped a -> Wrapped a -> Wrapped a
forall a. Divisive a => Multiplicative (Wrapped a)
forall a. Divisive a => Wrapped a -> Wrapped a
forall a. Divisive a => Wrapped a -> Wrapped a -> Wrapped a
forall a.
Multiplicative a =>
(a -> a) -> (a -> a -> a) -> Divisive a
$crecip :: forall a. Divisive a => Wrapped a -> Wrapped a
recip :: Wrapped a -> Wrapped a
$c/ :: forall a. Divisive a => Wrapped a -> Wrapped a -> Wrapped a
/ :: Wrapped a -> Wrapped a -> Wrapped a
Divisive,
      Field (Wrapped a)
Field (Wrapped a) =>
(Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a)
-> ExpField (Wrapped a)
Wrapped a -> Wrapped a
Wrapped a -> Wrapped a -> Wrapped a
forall a.
Field a =>
(a -> a)
-> (a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> ExpField a
forall a. ExpField a => Field (Wrapped a)
forall a. ExpField a => Wrapped a -> Wrapped a
forall a. ExpField a => Wrapped a -> Wrapped a -> Wrapped a
$cexp :: forall a. ExpField a => Wrapped a -> Wrapped a
exp :: Wrapped a -> Wrapped a
$clog :: forall a. ExpField a => Wrapped a -> Wrapped a
log :: Wrapped a -> Wrapped a
$c** :: forall a. ExpField a => Wrapped a -> Wrapped a -> Wrapped a
** :: Wrapped a -> Wrapped a -> Wrapped a
$clogBase :: forall a. ExpField a => Wrapped a -> Wrapped a -> Wrapped a
logBase :: Wrapped a -> Wrapped a -> Wrapped a
$csqrt :: forall a. ExpField a => Wrapped a -> Wrapped a
sqrt :: Wrapped a -> Wrapped a
ExpField,
      Field (Wrapped a)
Wrapped a
Field (Wrapped a) =>
Wrapped a
-> (Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a)
-> TrigField (Wrapped a)
Wrapped a -> Wrapped a
Wrapped a -> Wrapped a -> Wrapped a
forall a.
Field a =>
a
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> TrigField a
forall a. TrigField a => Field (Wrapped a)
forall a. TrigField a => Wrapped a
forall a. TrigField a => Wrapped a -> Wrapped a
forall a. TrigField a => Wrapped a -> Wrapped a -> Wrapped a
$cpi :: forall a. TrigField a => Wrapped a
pi :: Wrapped a
$csin :: forall a. TrigField a => Wrapped a -> Wrapped a
sin :: Wrapped a -> Wrapped a
$ccos :: forall a. TrigField a => Wrapped a -> Wrapped a
cos :: Wrapped a -> Wrapped a
$ctan :: forall a. TrigField a => Wrapped a -> Wrapped a
tan :: Wrapped a -> Wrapped a
$casin :: forall a. TrigField a => Wrapped a -> Wrapped a
asin :: Wrapped a -> Wrapped a
$cacos :: forall a. TrigField a => Wrapped a -> Wrapped a
acos :: Wrapped a -> Wrapped a
$catan :: forall a. TrigField a => Wrapped a -> Wrapped a
atan :: Wrapped a -> Wrapped a
$catan2 :: forall a. TrigField a => Wrapped a -> Wrapped a -> Wrapped a
atan2 :: Wrapped a -> Wrapped a -> Wrapped a
$csinh :: forall a. TrigField a => Wrapped a -> Wrapped a
sinh :: Wrapped a -> Wrapped a
$ccosh :: forall a. TrigField a => Wrapped a -> Wrapped a
cosh :: Wrapped a -> Wrapped a
$ctanh :: forall a. TrigField a => Wrapped a -> Wrapped a
tanh :: Wrapped a -> Wrapped a
$casinh :: forall a. TrigField a => Wrapped a -> Wrapped a
asinh :: Wrapped a -> Wrapped a
$cacosh :: forall a. TrigField a => Wrapped a -> Wrapped a
acosh :: Wrapped a -> Wrapped a
$catanh :: forall a. TrigField a => Wrapped a -> Wrapped a
atanh :: Wrapped a -> Wrapped a
TrigField,
      Distributive (Wrapped a)
Distributive (Wrapped a) =>
(Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a) -> StarSemiring (Wrapped a)
Wrapped a -> Wrapped a
forall a. Distributive a => (a -> a) -> (a -> a) -> StarSemiring a
forall a. StarSemiring a => Distributive (Wrapped a)
forall a. StarSemiring a => Wrapped a -> Wrapped a
$cstar :: forall a. StarSemiring a => Wrapped a -> Wrapped a
star :: Wrapped a -> Wrapped a
$cplus :: forall a. StarSemiring a => Wrapped a -> Wrapped a
plus :: Wrapped a -> Wrapped a
StarSemiring,
      Distributive (Wrapped a)
Distributive (Wrapped a) =>
(Wrapped a -> Wrapped a) -> InvolutiveRing (Wrapped a)
Wrapped a -> Wrapped a
forall a. Distributive a => (a -> a) -> InvolutiveRing a
forall a. InvolutiveRing a => Distributive (Wrapped a)
forall a. InvolutiveRing a => Wrapped a -> Wrapped a
$cadj :: forall a. InvolutiveRing a => Wrapped a -> Wrapped a
adj :: Wrapped a -> Wrapped a
InvolutiveRing,
      Distributive (Wrapped a)
Distributive (Wrapped a) =>
(Wrapped a -> Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a -> (Wrapped a, Wrapped a))
-> (Wrapped a -> Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a -> Wrapped a)
-> (Wrapped a -> Wrapped a -> (Wrapped a, Wrapped a))
-> Integral (Wrapped a)
Wrapped a -> Wrapped a -> (Wrapped a, Wrapped a)
Wrapped a -> Wrapped a -> Wrapped a
forall a.
Distributive a =>
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> Integral a
forall a. Integral a => Distributive (Wrapped a)
forall a.
Integral a =>
Wrapped a -> Wrapped a -> (Wrapped a, Wrapped a)
forall a. Integral a => Wrapped a -> Wrapped a -> Wrapped a
$cdiv :: forall a. Integral a => Wrapped a -> Wrapped a -> Wrapped a
div :: Wrapped a -> Wrapped a -> Wrapped a
$cmod :: forall a. Integral a => Wrapped a -> Wrapped a -> Wrapped a
mod :: Wrapped a -> Wrapped a -> Wrapped a
$cdivMod :: forall a.
Integral a =>
Wrapped a -> Wrapped a -> (Wrapped a, Wrapped a)
divMod :: Wrapped a -> Wrapped a -> (Wrapped a, Wrapped a)
$cquot :: forall a. Integral a => Wrapped a -> Wrapped a -> Wrapped a
quot :: Wrapped a -> Wrapped a -> Wrapped a
$crem :: forall a. Integral a => Wrapped a -> Wrapped a -> Wrapped a
rem :: Wrapped a -> Wrapped a -> Wrapped a
$cquotRem :: forall a.
Integral a =>
Wrapped a -> Wrapped a -> (Wrapped a, Wrapped a)
quotRem :: Wrapped a -> Wrapped a -> (Wrapped a, Wrapped a)
Integral,
      Integer -> Wrapped a
(Integer -> Wrapped a) -> FromInteger (Wrapped a)
forall a. FromInteger a => Integer -> Wrapped a
forall a. (Integer -> a) -> FromInteger a
$cfromInteger :: forall a. FromInteger a => Integer -> Wrapped a
fromInteger :: Integer -> Wrapped a
FromInteger,
      Rational -> Wrapped a
(Rational -> Wrapped a) -> FromRational (Wrapped a)
forall a. FromRational a => Rational -> Wrapped a
forall a. (Rational -> a) -> FromRational a
$cfromRational :: forall a. FromRational a => Rational -> Wrapped a
fromRational :: Rational -> Wrapped a
FromRational,
      Eq (Wrapped a)
Eq (Wrapped a) =>
(Wrapped a -> Wrapped a -> Wrapped a)
-> MeetSemiLattice (Wrapped a)
Wrapped a -> Wrapped a -> Wrapped a
forall a. Eq a => (a -> a -> a) -> MeetSemiLattice a
forall a. MeetSemiLattice a => Eq (Wrapped a)
forall a. MeetSemiLattice a => Wrapped a -> Wrapped a -> Wrapped a
$c/\ :: forall a. MeetSemiLattice a => Wrapped a -> Wrapped a -> Wrapped a
/\ :: Wrapped a -> Wrapped a -> Wrapped a
MeetSemiLattice,
      Eq (Wrapped a)
Eq (Wrapped a) =>
(Wrapped a -> Wrapped a -> Wrapped a)
-> JoinSemiLattice (Wrapped a)
Wrapped a -> Wrapped a -> Wrapped a
forall a. Eq a => (a -> a -> a) -> JoinSemiLattice a
forall a. JoinSemiLattice a => Eq (Wrapped a)
forall a. JoinSemiLattice a => Wrapped a -> Wrapped a -> Wrapped a
$c\/ :: forall a. JoinSemiLattice a => Wrapped a -> Wrapped a -> Wrapped a
\/ :: Wrapped a -> Wrapped a -> Wrapped a
JoinSemiLattice,
      JoinSemiLattice (Wrapped a)
Wrapped a
JoinSemiLattice (Wrapped a) =>
Wrapped a -> BoundedJoinSemiLattice (Wrapped a)
forall a. BoundedJoinSemiLattice a => JoinSemiLattice (Wrapped a)
forall a. BoundedJoinSemiLattice a => Wrapped a
forall a. JoinSemiLattice a => a -> BoundedJoinSemiLattice a
$cbottom :: forall a. BoundedJoinSemiLattice a => Wrapped a
bottom :: Wrapped a
BoundedJoinSemiLattice,
      MeetSemiLattice (Wrapped a)
Wrapped a
MeetSemiLattice (Wrapped a) =>
Wrapped a -> BoundedMeetSemiLattice (Wrapped a)
forall a. BoundedMeetSemiLattice a => MeetSemiLattice (Wrapped a)
forall a. BoundedMeetSemiLattice a => Wrapped a
forall a. MeetSemiLattice a => a -> BoundedMeetSemiLattice a
$ctop :: forall a. BoundedMeetSemiLattice a => Wrapped a
top :: Wrapped a
BoundedMeetSemiLattice,
      Distributive (Mag (Wrapped a))
Distributive (Mag (Wrapped a)) =>
(Wrapped a -> Mag (Wrapped a))
-> (Wrapped a -> Base (Wrapped a)) -> Basis (Wrapped a)
Wrapped a -> Mag (Wrapped a)
Wrapped a -> Base (Wrapped a)
forall a.
Distributive (Mag a) =>
(a -> Mag a) -> (a -> Base a) -> Basis a
forall a. Basis a => Distributive (Mag (Wrapped a))
forall a. Basis a => Wrapped a -> Mag (Wrapped a)
forall a. Basis a => Wrapped a -> Base (Wrapped a)
$cmagnitude :: forall a. Basis a => Wrapped a -> Mag (Wrapped a)
magnitude :: Wrapped a -> Mag (Wrapped a)
$cbasis :: forall a. Basis a => Wrapped a -> Base (Wrapped a)
basis :: Wrapped a -> Base (Wrapped a)
Basis,
      Distributive (Dir (Wrapped a))
Distributive (Wrapped a)
(Distributive (Wrapped a), Distributive (Dir (Wrapped a))) =>
(Wrapped a -> Dir (Wrapped a))
-> (Dir (Wrapped a) -> Wrapped a) -> Direction (Wrapped a)
Dir (Wrapped a) -> Wrapped a
Wrapped a -> Dir (Wrapped a)
forall coord.
(Distributive coord, Distributive (Dir coord)) =>
(coord -> Dir coord) -> (Dir coord -> coord) -> Direction coord
forall a. Direction a => Distributive (Dir (Wrapped a))
forall a. Direction a => Distributive (Wrapped a)
forall a. Direction a => Dir (Wrapped a) -> Wrapped a
forall a. Direction a => Wrapped a -> Dir (Wrapped a)
$cangle :: forall a. Direction a => Wrapped a -> Dir (Wrapped a)
angle :: Wrapped a -> Dir (Wrapped a)
$cray :: forall a. Direction a => Dir (Wrapped a) -> Wrapped a
ray :: Dir (Wrapped a) -> Wrapped a
Direction,
      Eq (Wrapped a)
Additive (Wrapped a)
Wrapped a
(Eq (Wrapped a), Additive (Wrapped a)) =>
Wrapped a -> Epsilon (Wrapped a)
forall a. (Eq a, Additive a) => a -> Epsilon a
forall a. Epsilon a => Eq (Wrapped a)
forall a. Epsilon a => Additive (Wrapped a)
forall a. Epsilon a => Wrapped a
$cepsilon :: forall a. Epsilon a => Wrapped a
epsilon :: Wrapped a
Epsilon,
      Additive (AdditiveScalar (Wrapped a))
Additive (AdditiveScalar (Wrapped a)) =>
(Wrapped a -> AdditiveScalar (Wrapped a) -> Wrapped a)
-> AdditiveAction (Wrapped a)
Wrapped a -> AdditiveScalar (Wrapped a) -> Wrapped a
forall m.
Additive (AdditiveScalar m) =>
(m -> AdditiveScalar m -> m) -> AdditiveAction m
forall a. AdditiveAction a => Additive (AdditiveScalar (Wrapped a))
forall a.
AdditiveAction a =>
Wrapped a -> AdditiveScalar (Wrapped a) -> Wrapped a
$c|+ :: forall a.
AdditiveAction a =>
Wrapped a -> AdditiveScalar (Wrapped a) -> Wrapped a
|+ :: Wrapped a -> AdditiveScalar (Wrapped a) -> Wrapped a
AdditiveAction,
      Subtractive (AdditiveScalar (Wrapped a))
AdditiveAction (Wrapped a)
(AdditiveAction (Wrapped a),
 Subtractive (AdditiveScalar (Wrapped a))) =>
(Wrapped a -> AdditiveScalar (Wrapped a) -> Wrapped a)
-> SubtractiveAction (Wrapped a)
Wrapped a -> AdditiveScalar (Wrapped a) -> Wrapped a
forall a.
SubtractiveAction a =>
Subtractive (AdditiveScalar (Wrapped a))
forall a. SubtractiveAction a => AdditiveAction (Wrapped a)
forall a.
SubtractiveAction a =>
Wrapped a -> AdditiveScalar (Wrapped a) -> Wrapped a
forall m.
(AdditiveAction m, Subtractive (AdditiveScalar m)) =>
(m -> AdditiveScalar m -> m) -> SubtractiveAction m
$c|- :: forall a.
SubtractiveAction a =>
Wrapped a -> AdditiveScalar (Wrapped a) -> Wrapped a
|- :: Wrapped a -> AdditiveScalar (Wrapped a) -> Wrapped a
SubtractiveAction,
      Multiplicative (Scalar (Wrapped a))
Multiplicative (Scalar (Wrapped a)) =>
(Wrapped a -> Scalar (Wrapped a) -> Wrapped a)
-> MultiplicativeAction (Wrapped a)
Wrapped a -> Scalar (Wrapped a) -> Wrapped a
forall m.
Multiplicative (Scalar m) =>
(m -> Scalar m -> m) -> MultiplicativeAction m
forall a.
MultiplicativeAction a =>
Multiplicative (Scalar (Wrapped a))
forall a.
MultiplicativeAction a =>
Wrapped a -> Scalar (Wrapped a) -> Wrapped a
$c|* :: forall a.
MultiplicativeAction a =>
Wrapped a -> Scalar (Wrapped a) -> Wrapped a
|* :: Wrapped a -> Scalar (Wrapped a) -> Wrapped a
MultiplicativeAction,
      Divisive (Scalar (Wrapped a))
MultiplicativeAction (Wrapped a)
(Divisive (Scalar (Wrapped a)),
 MultiplicativeAction (Wrapped a)) =>
(Wrapped a -> Scalar (Wrapped a) -> Wrapped a)
-> DivisiveAction (Wrapped a)
Wrapped a -> Scalar (Wrapped a) -> Wrapped a
forall m.
(Divisive (Scalar m), MultiplicativeAction m) =>
(m -> Scalar m -> m) -> DivisiveAction m
forall a. DivisiveAction a => Divisive (Scalar (Wrapped a))
forall a. DivisiveAction a => MultiplicativeAction (Wrapped a)
forall a.
DivisiveAction a =>
Wrapped a -> Scalar (Wrapped a) -> Wrapped a
$c|/ :: forall a.
DivisiveAction a =>
Wrapped a -> Scalar (Wrapped a) -> Wrapped a
|/ :: Wrapped a -> Scalar (Wrapped a) -> Wrapped a
DivisiveAction
    )

instance
  (P.Ord a, P.Eq (Whole a), Integral (Whole a), Subtractive (Whole a), Subtractive a, QuotientField a) =>
  QuotientField (Wrapped a)
  where
  type Whole (Wrapped a) = Whole a
  properFraction :: Wrapped a -> (Whole (Wrapped a), Wrapped a)
properFraction (Wrapped a
a) = let (Whole a
i, a
r) = a -> (Whole a, a)
forall a. QuotientField a => a -> (Whole a, a)
properFraction a
a in (Whole a
Whole (Wrapped a)
i, a -> Wrapped a
forall a. a -> Wrapped a
Wrapped a
r)

instance (FromIntegral a b) => FromIntegral (Wrapped a) b where
  fromIntegral :: b -> Wrapped a
fromIntegral b
a = a -> Wrapped a
forall a. a -> Wrapped a
Wrapped (b -> a
forall a b. FromIntegral a b => b -> a
fromIntegral b
a)

instance (ToIntegral a b) => ToIntegral (Wrapped a) b where
  toIntegral :: Wrapped a -> b
toIntegral (Wrapped a
a) = a -> b
forall a b. ToIntegral a b => a -> b
toIntegral a
a

instance (FromRatio a b) => FromRatio (Wrapped a) b where
  fromRatio :: Ratio b -> Wrapped a
fromRatio Ratio b
a = a -> Wrapped a
forall a. a -> Wrapped a
Wrapped (Ratio b -> a
forall a b. FromRatio a b => Ratio b -> a
fromRatio Ratio b
a)

instance (ToRatio a b) => ToRatio (Wrapped a) b where
  toRatio :: Wrapped a -> Ratio b
toRatio (Wrapped a
a) = a -> Ratio b
forall a b. ToRatio a b => a -> Ratio b
toRatio a
a