packages feed

AERN-Real-Interval-2011.1: src/Numeric/AERN/Basics/Interval/Basics.hs

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
{-|
    Module      :  Numeric.AERN.Basics.Interval.Basics
    Description :  interval datatype and its basic instances 
    Copyright   :  (c) Michal Konecny, Jan Duracz
    License     :  BSD3

    Maintainer  :  mikkonecny@gmail.com
    Stability   :  experimental
    Portability :  portable
    
    Interval datatype and its basic instances.
    
    This is a hidden module reexported via its parent.
-}
module Numeric.AERN.Basics.Interval.Basics 
(
   Interval(..), 
   getEndpoints, fromEndpoints, mapBothEndpoints, mapEachEndpoint, mapEndpointPair 
)
where

import Prelude hiding (EQ, LT, GT)

import Numeric.AERN.Basics.ShowInternals
import Numeric.AERN.Basics.PartialOrdering

import qualified Numeric.AERN.Basics.NumericOrder as NumOrd
import Numeric.AERN.Basics.NumericOrder.OpsImplicitEffort

import Control.DeepSeq

{-|
    Pairs of endpoints.  An end user should not use this type directly
    but use the classes of which this is an instance. 
-}
data Interval e =
    Interval
    { 
        leftEndpoint :: ! e,
        rightEndpoint :: ! e
    }
    
instance (ShowInternals e, NumOrd.PartialComparison e) => (ShowInternals (Interval e))
    where
    type ShowInternalsIndicator (Interval e) = ShowInternalsIndicator e
    defaultShowIndicator (Interval l r) = defaultShowIndicator l
    showInternals indicator (Interval l r) =
        case (NumOrd.pCompareEff (NumOrd.pCompareDefaultEffort l) l r) of
            Just EQ -> "<" ++ showL ++ ">"
            Just LT -> showConsistent
            Just LEE -> showConsistent
            Just GT -> showAnticonsistent
            Just GEE -> showAnticonsistent
            _ -> showUnknown
        where
        showL = showInternals indicator l
        showR = showInternals indicator r
        showConsistent = "[." ++ showL ++ "," ++ showR ++ "^]"
        showAnticonsistent = "[^" ++ showL ++ "," ++ showR ++ ".]"
        showUnknown = "[?" ++ showL ++ "," ++ showR ++ "?]"

instance (ShowInternals e, NumOrd.PartialComparison e) => (Show (Interval e))
    where
    show i = showInternals (defaultShowIndicator i) i

instance (NFData e) => NFData (Interval e) where
    rnf (Interval l r) =
        rnf l `seq` rnf r `seq` () 
--        l `seq` r `seq` () 

-- | Given an argument interval 'i' 'getEndpoints' returns the endpoint pair 
--   ('leftEndpoint' 'i','rightEndpoint' 'i').
getEndpoints :: Interval t -> (t,t)
getEndpoints (Interval l r) = (l, r)

-- | Constructs an interval from an endpoint pair.
fromEndpoints :: (t,t) -> Interval t
fromEndpoints (l,r) = Interval l r 

mapBothEndpoints f (Interval l r) = Interval (f l) (f r)

mapEachEndpoint fl fh (Interval l r) = Interval (fl l) (fh r)

mapEndpointPair f (Interval l r) = 
    Interval fl fr
    where
    (fl, fr) = f (l, r)