{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RoleAnnotations #-}
{-# OPTIONS_GHC -Wall #-}
module NumHask.Data.Wrapped where
import NumHask.Algebra.Abstract.Additive
import NumHask.Algebra.Abstract.Field
import NumHask.Algebra.Abstract.Multiplicative
import NumHask.Algebra.Abstract.Ring
import NumHask.Algebra.Abstract.Lattice
import NumHask.Algebra.Abstract.Group
import NumHask.Analysis.Metric
import NumHask.Data.Integral
import NumHask.Data.Rational
import qualified Prelude as P
newtype Wrapped a = Wrapped { unWrapped :: a }
deriving
( P.Show
, P.Eq
, P.Ord
, Magma
, Idempotent
, Additive
, Subtractive
, Multiplicative
, Divisive
, Distributive
, IntegralDomain
, InvolutiveRing
, StarSemiring
, KleeneAlgebra
, Field
, ExpField
, TrigField
, Integral
, Signed
, MeetSemiLattice
, JoinSemiLattice
, Epsilon
, UpperBoundedField
, LowerBoundedField
)
type role Wrapped representational
instance (P.Ord a, QuotientField a P.Integer) =>
QuotientField (Wrapped a) (Wrapped P.Integer) where
properFraction (Wrapped a) = let (i,r) = properFraction a in (Wrapped i, Wrapped r)
instance (FromIntegral a b) => FromIntegral (Wrapped a) b where
fromIntegral_ a = Wrapped (fromIntegral_ a)
instance (ToIntegral a b) => ToIntegral (Wrapped a) b where
toIntegral (Wrapped a) = toIntegral a
instance (FromRatio a b) => FromRatio (Wrapped a) b where
fromRatio a = Wrapped (fromRatio a)
instance (ToRatio a b) => ToRatio (Wrapped a) b where
toRatio (Wrapped a) = toRatio a
instance (Normed a b) => Normed (Wrapped a) (Wrapped b) where
normL1 (Wrapped a) = Wrapped (normL1 a)
normL2 (Wrapped a) = Wrapped (normL2 a)
instance (Metric a b) => Metric (Wrapped a) (Wrapped b) where
distanceL1 (Wrapped a) (Wrapped b) = Wrapped (distanceL1 a b)
distanceL2 (Wrapped a) (Wrapped b) = Wrapped (distanceL2 a b)