cpython-3.1.0: CPython/Types/Complex.chs
-- Copyright (C) 2009 John Millikin <jmillikin@gmail.com>
--
-- 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
-- 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/>.
--
{-# LANGUAGE ForeignFunctionInterface #-}
module CPython.Types.Complex
( Complex
, complexType
, toComplex
, fromComplex
) where
import qualified Data.Complex as C
import CPython.Internal
#include <hscpython-shim.h>
newtype Complex = Complex (ForeignPtr Complex)
instance Object Complex where
toObject (Complex x) = SomeObject x
fromForeignPtr = Complex
instance Concrete Complex where
concreteType _ = complexType
{# fun pure hscpython_PyComplex_Type as complexType
{} -> `Type' peekStaticObject* #}
toComplex :: C.Complex Double -> IO Complex
toComplex x = raw >>= stealObject where
real = realToFrac $ C.realPart x
imag = realToFrac $ C.imagPart x
raw = {# call PyComplex_FromDoubles as ^ #} real imag
fromComplex :: Complex -> IO (C.Complex Double)
fromComplex py = withObject py $ \pyPtr -> do
real <- {# call PyComplex_RealAsDouble as ^ #} pyPtr
imag <- {# call PyComplex_ImagAsDouble as ^ #} pyPtr
return $ realToFrac real C.:+ realToFrac imag