{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Lattices.UnitInterval(
    UnitInterval(..),
    mkUnitInterval
) where

import Lattices.ResiduatedLattice

-- | unit interval on real numbers [0,1]

newtype UnitInterval = UnitInterval Double 
    deriving (UnitInterval -> UnitInterval -> Bool
(UnitInterval -> UnitInterval -> Bool)
-> (UnitInterval -> UnitInterval -> Bool) -> Eq UnitInterval
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UnitInterval -> UnitInterval -> Bool
== :: UnitInterval -> UnitInterval -> Bool
$c/= :: UnitInterval -> UnitInterval -> Bool
/= :: UnitInterval -> UnitInterval -> Bool
Eq, Eq UnitInterval
Eq UnitInterval =>
(UnitInterval -> UnitInterval -> Ordering)
-> (UnitInterval -> UnitInterval -> Bool)
-> (UnitInterval -> UnitInterval -> Bool)
-> (UnitInterval -> UnitInterval -> Bool)
-> (UnitInterval -> UnitInterval -> Bool)
-> (UnitInterval -> UnitInterval -> UnitInterval)
-> (UnitInterval -> UnitInterval -> UnitInterval)
-> Ord UnitInterval
UnitInterval -> UnitInterval -> Bool
UnitInterval -> UnitInterval -> Ordering
UnitInterval -> UnitInterval -> UnitInterval
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
$ccompare :: UnitInterval -> UnitInterval -> Ordering
compare :: UnitInterval -> UnitInterval -> Ordering
$c< :: UnitInterval -> UnitInterval -> Bool
< :: UnitInterval -> UnitInterval -> Bool
$c<= :: UnitInterval -> UnitInterval -> Bool
<= :: UnitInterval -> UnitInterval -> Bool
$c> :: UnitInterval -> UnitInterval -> Bool
> :: UnitInterval -> UnitInterval -> Bool
$c>= :: UnitInterval -> UnitInterval -> Bool
>= :: UnitInterval -> UnitInterval -> Bool
$cmax :: UnitInterval -> UnitInterval -> UnitInterval
max :: UnitInterval -> UnitInterval -> UnitInterval
$cmin :: UnitInterval -> UnitInterval -> UnitInterval
min :: UnitInterval -> UnitInterval -> UnitInterval
Ord, Integer -> UnitInterval
UnitInterval -> UnitInterval
UnitInterval -> UnitInterval -> UnitInterval
(UnitInterval -> UnitInterval -> UnitInterval)
-> (UnitInterval -> UnitInterval -> UnitInterval)
-> (UnitInterval -> UnitInterval -> UnitInterval)
-> (UnitInterval -> UnitInterval)
-> (UnitInterval -> UnitInterval)
-> (UnitInterval -> UnitInterval)
-> (Integer -> UnitInterval)
-> Num UnitInterval
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: UnitInterval -> UnitInterval -> UnitInterval
+ :: UnitInterval -> UnitInterval -> UnitInterval
$c- :: UnitInterval -> UnitInterval -> UnitInterval
- :: UnitInterval -> UnitInterval -> UnitInterval
$c* :: UnitInterval -> UnitInterval -> UnitInterval
* :: UnitInterval -> UnitInterval -> UnitInterval
$cnegate :: UnitInterval -> UnitInterval
negate :: UnitInterval -> UnitInterval
$cabs :: UnitInterval -> UnitInterval
abs :: UnitInterval -> UnitInterval
$csignum :: UnitInterval -> UnitInterval
signum :: UnitInterval -> UnitInterval
$cfromInteger :: Integer -> UnitInterval
fromInteger :: Integer -> UnitInterval
Num, Num UnitInterval
Ord UnitInterval
(Num UnitInterval, Ord UnitInterval) =>
(UnitInterval -> Rational) -> Real UnitInterval
UnitInterval -> Rational
forall a. (Num a, Ord a) => (a -> Rational) -> Real a
$ctoRational :: UnitInterval -> Rational
toRational :: UnitInterval -> Rational
Real, Fractional UnitInterval
Real UnitInterval
(Real UnitInterval, Fractional UnitInterval) =>
(forall b. Integral b => UnitInterval -> (b, UnitInterval))
-> (forall b. Integral b => UnitInterval -> b)
-> (forall b. Integral b => UnitInterval -> b)
-> (forall b. Integral b => UnitInterval -> b)
-> (forall b. Integral b => UnitInterval -> b)
-> RealFrac UnitInterval
forall b. Integral b => UnitInterval -> b
forall b. Integral b => UnitInterval -> (b, UnitInterval)
forall a.
(Real a, Fractional a) =>
(forall b. Integral b => a -> (b, a))
-> (forall b. Integral b => a -> b)
-> (forall b. Integral b => a -> b)
-> (forall b. Integral b => a -> b)
-> (forall b. Integral b => a -> b)
-> RealFrac a
$cproperFraction :: forall b. Integral b => UnitInterval -> (b, UnitInterval)
properFraction :: forall b. Integral b => UnitInterval -> (b, UnitInterval)
$ctruncate :: forall b. Integral b => UnitInterval -> b
truncate :: forall b. Integral b => UnitInterval -> b
$cround :: forall b. Integral b => UnitInterval -> b
round :: forall b. Integral b => UnitInterval -> b
$cceiling :: forall b. Integral b => UnitInterval -> b
ceiling :: forall b. Integral b => UnitInterval -> b
$cfloor :: forall b. Integral b => UnitInterval -> b
floor :: forall b. Integral b => UnitInterval -> b
RealFrac, Num UnitInterval
Num UnitInterval =>
(UnitInterval -> UnitInterval -> UnitInterval)
-> (UnitInterval -> UnitInterval)
-> (Rational -> UnitInterval)
-> Fractional UnitInterval
Rational -> UnitInterval
UnitInterval -> UnitInterval
UnitInterval -> UnitInterval -> UnitInterval
forall a.
Num a =>
(a -> a -> a) -> (a -> a) -> (Rational -> a) -> Fractional a
$c/ :: UnitInterval -> UnitInterval -> UnitInterval
/ :: UnitInterval -> UnitInterval -> UnitInterval
$crecip :: UnitInterval -> UnitInterval
recip :: UnitInterval -> UnitInterval
$cfromRational :: Rational -> UnitInterval
fromRational :: Rational -> UnitInterval
Fractional)

instance BoundedLattice UnitInterval where
    /\ :: UnitInterval -> UnitInterval -> UnitInterval
(/\) = UnitInterval -> UnitInterval -> UnitInterval
forall a. Ord a => a -> a -> a
min
    \/ :: UnitInterval -> UnitInterval -> UnitInterval
(\/) = UnitInterval -> UnitInterval -> UnitInterval
forall a. Ord a => a -> a -> a
max
    top :: UnitInterval
top = UnitInterval
1
    bot :: UnitInterval
bot = UnitInterval
0
    mkLattice :: Double -> UnitInterval
mkLattice = Double -> UnitInterval
mkUnitInterval

instance Show UnitInterval where
    show :: UnitInterval -> String
show (UnitInterval Double
x) = Double -> String
forall a. Show a => a -> String
show Double
x

-- | Unit interval constructor. Ensures values are in bounds

mkUnitInterval :: Double -> UnitInterval
mkUnitInterval :: Double -> UnitInterval
mkUnitInterval Double
x = Double -> UnitInterval
UnitInterval (Double -> UnitInterval) -> Double -> UnitInterval
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Double
forall a. Ord a => a -> a -> a
max Double
0 (Double -> Double) -> Double -> Double
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Double
forall a. Ord a => a -> a -> a
min Double
1 Double
x