packages feed

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

{-# LANGUAGE TypeFamilies #-}
{-|
    Module      :  Numeric.AERN.Basics.Interval.Mutable
    Description :  mutable version of Interval
    Copyright   :  (c) Michal Konecny
    License     :  BSD3

    Maintainer  :  mikkonecny@gmail.com
    Stability   :  experimental
    Portability :  portable

    Mutable version of Interval.
    
    This is a private module reexported publicly via its parent.
-}

module Numeric.AERN.Basics.Interval.Mutable where

import Numeric.AERN.Basics.Interval.Basics
import Numeric.AERN.Basics.Mutable

import Numeric.AERN.RealArithmetic.ExactOps

instance (CanBeMutable e) => CanBeMutable (Interval e) where
    data Mutable (Interval e) s = 
        MInterval { mIntervalLeft :: Mutable e s, mIntervalRight :: Mutable e s }
    makeMutable (Interval l r) = 
        do
        lM <- makeMutable l
        rM <- makeMutable r
        return $ MInterval lM rM
    unsafeMakeMutable (Interval l r) = 
        do
        lM <- unsafeMakeMutable l
        rM <- unsafeMakeMutable r
        return $ MInterval lM rM
    writeMutable (MInterval lM rM) (Interval l r) =
        do
        writeMutable lM l
        writeMutable rM r
    unsafeWriteMutable (MInterval lM rM) (Interval l r) =
        do
        unsafeWriteMutable lM l
        unsafeWriteMutable rM r
    readMutable (MInterval lM rM) =
        do
        l <- readMutable lM 
        r <- readMutable rM 
        return $ Interval l r
    unsafeReadMutable (MInterval lM rM) =
        do
        l <- unsafeReadMutable lM 
        r <- unsafeReadMutable rM 
        return $ Interval l r