{-# 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.Group import NumHask.Algebra.Abstract.Lattice import NumHask.Algebra.Abstract.Multiplicative import NumHask.Algebra.Abstract.Ring 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 ) -- not sure if this is correct or needed 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 norm (Wrapped a) = Wrapped (norm a) instance (Metric a b) => Metric (Wrapped a) (Wrapped b) where distance (Wrapped a) (Wrapped b) = Wrapped (distance a b)