{-
	Copyright (C) 2011-2015 Dr. Alistair Ward

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
-}
{- |
 [@AUTHOR@]	Dr. Alistair Ward

 [@DESCRIPTION@]	Defines the set of /Arithmetic-geometric Mean/-type /Pi/-algorithms which have been implemented; currently just one.
-}

module Factory.Math.Implementations.Pi.AGM.Algorithm(
-- * Types
-- ** Data-types
	Algorithm(..)
) where

import qualified	Data.Default
import qualified	Factory.Math.Implementations.Pi.AGM.BrentSalamin	as Math.Implementations.Pi.AGM.BrentSalamin
import qualified	Factory.Math.Pi						as Math.Pi
import qualified	Factory.Math.SquareRoot					as Math.SquareRoot

-- | Defines the available algorithms.
newtype Algorithm squareRootAlgorithm	= BrentSalamin squareRootAlgorithm	deriving (Algorithm squareRootAlgorithm
-> Algorithm squareRootAlgorithm -> Bool
(Algorithm squareRootAlgorithm
 -> Algorithm squareRootAlgorithm -> Bool)
-> (Algorithm squareRootAlgorithm
    -> Algorithm squareRootAlgorithm -> Bool)
-> Eq (Algorithm squareRootAlgorithm)
forall squareRootAlgorithm.
Eq squareRootAlgorithm =>
Algorithm squareRootAlgorithm
-> Algorithm squareRootAlgorithm -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Algorithm squareRootAlgorithm
-> Algorithm squareRootAlgorithm -> Bool
$c/= :: forall squareRootAlgorithm.
Eq squareRootAlgorithm =>
Algorithm squareRootAlgorithm
-> Algorithm squareRootAlgorithm -> Bool
== :: Algorithm squareRootAlgorithm
-> Algorithm squareRootAlgorithm -> Bool
$c== :: forall squareRootAlgorithm.
Eq squareRootAlgorithm =>
Algorithm squareRootAlgorithm
-> Algorithm squareRootAlgorithm -> Bool
Eq, ReadPrec [Algorithm squareRootAlgorithm]
ReadPrec (Algorithm squareRootAlgorithm)
Int -> ReadS (Algorithm squareRootAlgorithm)
ReadS [Algorithm squareRootAlgorithm]
(Int -> ReadS (Algorithm squareRootAlgorithm))
-> ReadS [Algorithm squareRootAlgorithm]
-> ReadPrec (Algorithm squareRootAlgorithm)
-> ReadPrec [Algorithm squareRootAlgorithm]
-> Read (Algorithm squareRootAlgorithm)
forall squareRootAlgorithm.
Read squareRootAlgorithm =>
ReadPrec [Algorithm squareRootAlgorithm]
forall squareRootAlgorithm.
Read squareRootAlgorithm =>
ReadPrec (Algorithm squareRootAlgorithm)
forall squareRootAlgorithm.
Read squareRootAlgorithm =>
Int -> ReadS (Algorithm squareRootAlgorithm)
forall squareRootAlgorithm.
Read squareRootAlgorithm =>
ReadS [Algorithm squareRootAlgorithm]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Algorithm squareRootAlgorithm]
$creadListPrec :: forall squareRootAlgorithm.
Read squareRootAlgorithm =>
ReadPrec [Algorithm squareRootAlgorithm]
readPrec :: ReadPrec (Algorithm squareRootAlgorithm)
$creadPrec :: forall squareRootAlgorithm.
Read squareRootAlgorithm =>
ReadPrec (Algorithm squareRootAlgorithm)
readList :: ReadS [Algorithm squareRootAlgorithm]
$creadList :: forall squareRootAlgorithm.
Read squareRootAlgorithm =>
ReadS [Algorithm squareRootAlgorithm]
readsPrec :: Int -> ReadS (Algorithm squareRootAlgorithm)
$creadsPrec :: forall squareRootAlgorithm.
Read squareRootAlgorithm =>
Int -> ReadS (Algorithm squareRootAlgorithm)
Read, Int -> Algorithm squareRootAlgorithm -> ShowS
[Algorithm squareRootAlgorithm] -> ShowS
Algorithm squareRootAlgorithm -> String
(Int -> Algorithm squareRootAlgorithm -> ShowS)
-> (Algorithm squareRootAlgorithm -> String)
-> ([Algorithm squareRootAlgorithm] -> ShowS)
-> Show (Algorithm squareRootAlgorithm)
forall squareRootAlgorithm.
Show squareRootAlgorithm =>
Int -> Algorithm squareRootAlgorithm -> ShowS
forall squareRootAlgorithm.
Show squareRootAlgorithm =>
[Algorithm squareRootAlgorithm] -> ShowS
forall squareRootAlgorithm.
Show squareRootAlgorithm =>
Algorithm squareRootAlgorithm -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Algorithm squareRootAlgorithm] -> ShowS
$cshowList :: forall squareRootAlgorithm.
Show squareRootAlgorithm =>
[Algorithm squareRootAlgorithm] -> ShowS
show :: Algorithm squareRootAlgorithm -> String
$cshow :: forall squareRootAlgorithm.
Show squareRootAlgorithm =>
Algorithm squareRootAlgorithm -> String
showsPrec :: Int -> Algorithm squareRootAlgorithm -> ShowS
$cshowsPrec :: forall squareRootAlgorithm.
Show squareRootAlgorithm =>
Int -> Algorithm squareRootAlgorithm -> ShowS
Show)

instance Data.Default.Default squareRootAlgorithm => Data.Default.Default (Algorithm squareRootAlgorithm)	where
	def :: Algorithm squareRootAlgorithm
def	= squareRootAlgorithm -> Algorithm squareRootAlgorithm
forall squareRootAlgorithm.
squareRootAlgorithm -> Algorithm squareRootAlgorithm
BrentSalamin squareRootAlgorithm
forall a. Default a => a
Data.Default.def

instance Math.SquareRoot.Algorithmic squareRootAlgorithm => Math.Pi.Algorithmic (Algorithm squareRootAlgorithm)	where
	openR :: Algorithm squareRootAlgorithm -> Int -> Rational
openR (BrentSalamin squareRootAlgorithm
squareRootAlgorithm)	= squareRootAlgorithm -> Int -> Rational
forall squareRootAlgorithm.
Algorithmic squareRootAlgorithm =>
squareRootAlgorithm -> Int -> Rational
Math.Implementations.Pi.AGM.BrentSalamin.openR squareRootAlgorithm
squareRootAlgorithm