module Graphics.Rasterific.QuadraticFormula( QuadraticFormula( .. )
, discriminant
, formulaRoots
) where
data QuadraticFormula a = QuadraticFormula
{ _coeffA :: !a
, _coeffB :: !a
, _coeffC :: !a
}
instance Functor QuadraticFormula where
{-# INLINE fmap #-}
fmap f (QuadraticFormula a b c) =
QuadraticFormula (f a) (f b) (f c)
instance Applicative QuadraticFormula where
pure a = QuadraticFormula a a a
{-# INLINE pure #-}
QuadraticFormula a b c <*> QuadraticFormula d e f =
QuadraticFormula (a d) (b e) (c f)
{-# INLINE (<*>) #-}
discriminant :: Num a => QuadraticFormula a -> a
discriminant (QuadraticFormula a b c) = b * b - 4 * a *c
formulaRoots :: (Ord a, Floating a) => QuadraticFormula a -> [a]
formulaRoots formula@(QuadraticFormula a b _)
| disc < 0 = []
| disc == 0 = [positiveResult]
| otherwise = [positiveResult, negativeResult]
where
disc = discriminant formula
squarePart = sqrt disc
positiveResult = (negate b + squarePart) / (2 * a)
negativeResult = (negate b - squarePart) / (2 * a)