-- GENERATED by C->Haskell Compiler, version 0.28.7 Switcheroo, 25 November 2017 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "lib/CPython/Protocols/Number.chs" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE ExistentialQuantification #-}

-- 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/>.

module CPython.Protocols.Number
  ( Number (..)
  , SomeNumber
  , castToNumber
  , add
  , subtract
  , multiply
  , floorDivide
  , trueDivide
  , remainder
  , divmod
  , power
  , negative
  , positive
  , absolute
  , invert
  , shiftL
  , shiftR
  , and
  , xor
  , or
  , inPlaceAdd
  , inPlaceSubtract
  , inPlaceMultiply
  , inPlaceFloorDivide
  , inPlaceTrueDivide
  , inPlaceRemainder
  , inPlacePower
  , inPlaceShiftL
  , inPlaceShiftR
  , inPlaceAnd
  , inPlaceXor
  , inPlaceOr
  , toInteger
  , toFloat
  , toBase
  ) where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.Ptr as C2HSImp





import           Prelude hiding (Integer, Float, subtract, and, or, toInteger)
import qualified Prelude as Prelude

import           CPython.Constants (none)
import           CPython.Internal hiding (xor, shiftR, shiftL)
import           CPython.Types.Complex (Complex)
import           CPython.Types.Float (Float)
import           CPython.Types.Integer (Integer)
import           CPython.Types.Set (Set, FrozenSet)
import           CPython.Types.Unicode (Unicode)

data SomeNumber = forall a. (Number a) => SomeNumber (ForeignPtr a)

class Object a => Number a where
  toNumber :: a -> SomeNumber

instance Object SomeNumber where
  toObject :: SomeNumber -> SomeObject
toObject (SomeNumber x :: ForeignPtr a
x) = ForeignPtr a -> SomeObject
forall a. Object a => ForeignPtr a -> SomeObject
SomeObject ForeignPtr a
x
  fromForeignPtr :: ForeignPtr SomeNumber -> SomeNumber
fromForeignPtr = ForeignPtr SomeNumber -> SomeNumber
forall a. Number a => ForeignPtr a -> SomeNumber
SomeNumber

instance Number SomeNumber where
  toNumber :: SomeNumber -> SomeNumber
toNumber = SomeNumber -> SomeNumber
forall a. a -> a
id

instance Number Integer where
  toNumber :: Integer -> SomeNumber
toNumber = Integer -> SomeNumber
forall a. Object a => a -> SomeNumber
unsafeCastToNumber

instance Number Float where
  toNumber :: Float -> SomeNumber
toNumber = Float -> SomeNumber
forall a. Object a => a -> SomeNumber
unsafeCastToNumber

instance Number Complex where
  toNumber :: Complex -> SomeNumber
toNumber = Complex -> SomeNumber
forall a. Object a => a -> SomeNumber
unsafeCastToNumber

-- lol wut
instance Number Set where
  toNumber :: Set -> SomeNumber
toNumber = Set -> SomeNumber
forall a. Object a => a -> SomeNumber
unsafeCastToNumber

instance Number FrozenSet where
  toNumber :: FrozenSet -> SomeNumber
toNumber = FrozenSet -> SomeNumber
forall a. Object a => a -> SomeNumber
unsafeCastToNumber

unsafeCastToNumber :: Object a => a -> SomeNumber
unsafeCastToNumber :: a -> SomeNumber
unsafeCastToNumber x :: a
x = case a -> SomeObject
forall a. Object a => a -> SomeObject
toObject a
x of
  SomeObject ptr :: ForeignPtr a
ptr -> let
    ptr' :: ForeignPtr SomeNumber
ptr' = ForeignPtr a -> ForeignPtr SomeNumber
forall a b. ForeignPtr a -> ForeignPtr b
castForeignPtr ForeignPtr a
ptr :: ForeignPtr SomeNumber
    in ForeignPtr SomeNumber -> SomeNumber
forall a. Number a => ForeignPtr a -> SomeNumber
SomeNumber ForeignPtr SomeNumber
ptr'

castToNumber :: Object a => a -> IO (Maybe SomeNumber)
castToNumber :: a -> IO (Maybe SomeNumber)
castToNumber obj :: a
obj =
  a -> (Ptr () -> IO (Maybe SomeNumber)) -> IO (Maybe SomeNumber)
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject a
obj ((Ptr () -> IO (Maybe SomeNumber)) -> IO (Maybe SomeNumber))
-> (Ptr () -> IO (Maybe SomeNumber)) -> IO (Maybe SomeNumber)
forall a b. (a -> b) -> a -> b
$ \objPtr :: Ptr ()
objPtr -> do
  Bool
isNumber <- (CInt -> Bool) -> IO CInt -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CInt -> Bool
cToBool (IO CInt -> IO Bool) -> IO CInt -> IO Bool
forall a b. (a -> b) -> a -> b
$ Ptr () -> IO CInt
pyNumberCheck Ptr ()
objPtr
  Maybe SomeNumber -> IO (Maybe SomeNumber)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe SomeNumber -> IO (Maybe SomeNumber))
-> Maybe SomeNumber -> IO (Maybe SomeNumber)
forall a b. (a -> b) -> a -> b
$ if Bool
isNumber
    then SomeNumber -> Maybe SomeNumber
forall a. a -> Maybe a
Just (SomeNumber -> Maybe SomeNumber) -> SomeNumber -> Maybe SomeNumber
forall a b. (a -> b) -> a -> b
$ a -> SomeNumber
forall a. Object a => a -> SomeNumber
unsafeCastToNumber a
obj
    else Maybe SomeNumber
forall a. Maybe a
Nothing

add :: (Number a, Number b) => a -> b -> IO SomeNumber
add :: a -> b -> IO SomeNumber
add = a -> b -> IO SomeNumber
forall a b. (Number a, Number b) => a -> b -> IO SomeNumber
c_add

-- c2hs won't accept functions named "add" any more, so have it generate
-- c_add and then wrap that manually.
c_add :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
c_add :: a -> b -> IO SomeNumber
c_add a1 :: a
a1 a2 :: b
a2 =
  a -> (Ptr () -> IO SomeNumber) -> IO SomeNumber
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject a
a1 ((Ptr () -> IO SomeNumber) -> IO SomeNumber)
-> (Ptr () -> IO SomeNumber) -> IO SomeNumber
forall a b. (a -> b) -> a -> b
$ \a1' :: Ptr ()
a1' -> 
  b -> (Ptr () -> IO SomeNumber) -> IO SomeNumber
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject b
a2 ((Ptr () -> IO SomeNumber) -> IO SomeNumber)
-> (Ptr () -> IO SomeNumber) -> IO SomeNumber
forall a b. (a -> b) -> a -> b
$ \a2' :: Ptr ()
a2' -> 
  Ptr () -> Ptr () -> IO (Ptr ())
c_add'_ Ptr ()
a1' Ptr ()
a2' IO (Ptr ()) -> (Ptr () -> IO SomeNumber) -> IO SomeNumber
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res :: Ptr ()
res ->
  Ptr () -> IO SomeNumber
forall obj a. Object obj => Ptr a -> IO obj
stealObject Ptr ()
res IO SomeNumber -> (SomeNumber -> IO SomeNumber) -> IO SomeNumber
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res' :: SomeNumber
res' ->
  SomeNumber -> IO SomeNumber
forall (m :: * -> *) a. Monad m => a -> m a
return (SomeNumber
res')

{-# LINE 121 "lib/CPython/Protocols/Number.chs" #-}


subtract :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
subtract a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  subtract'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 127 "lib/CPython/Protocols/Number.chs" #-}


multiply :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
multiply a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  multiply'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 133 "lib/CPython/Protocols/Number.chs" #-}


floorDivide :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
floorDivide a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  floorDivide'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 139 "lib/CPython/Protocols/Number.chs" #-}


trueDivide :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
trueDivide a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  trueDivide'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 145 "lib/CPython/Protocols/Number.chs" #-}


remainder :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
remainder a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  remainder'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 151 "lib/CPython/Protocols/Number.chs" #-}


divmod :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
divmod a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  divmod'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 157 "lib/CPython/Protocols/Number.chs" #-}


power :: (Number a, Number b, Number c) => a -> b -> Maybe c -> IO SomeNumber
power a b mc =
  withObject a $ \aPtr ->
  withObject b $ \bPtr ->
  maybe none (return . toObject) mc >>= \c ->
  withObject c $ \cPtr ->
  pyNumberPower aPtr bPtr cPtr
  >>= stealObject

negative :: Number a => (a) -> IO ((SomeNumber))
negative :: a -> IO SomeNumber
negative a1 :: a
a1 =
  a -> (Ptr () -> IO SomeNumber) -> IO SomeNumber
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject a
a1 ((Ptr () -> IO SomeNumber) -> IO SomeNumber)
-> (Ptr () -> IO SomeNumber) -> IO SomeNumber
forall a b. (a -> b) -> a -> b
$ \a1' :: Ptr ()
a1' -> 
  Ptr () -> IO (Ptr ())
negative'_ Ptr ()
a1' IO (Ptr ()) -> (Ptr () -> IO SomeNumber) -> IO SomeNumber
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res :: Ptr ()
res ->
  Ptr () -> IO SomeNumber
forall obj a. Object obj => Ptr a -> IO obj
stealObject Ptr ()
res IO SomeNumber -> (SomeNumber -> IO SomeNumber) -> IO SomeNumber
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res' :: SomeNumber
res' ->
  SomeNumber -> IO SomeNumber
forall (m :: * -> *) a. Monad m => a -> m a
return (SomeNumber
res')

{-# LINE 171 "lib/CPython/Protocols/Number.chs" #-}


positive :: Number a => (a) -> IO ((SomeNumber))
positive a1 =
  withObject a1 $ \a1' -> 
  positive'_ a1' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 176 "lib/CPython/Protocols/Number.chs" #-}


absolute :: Number a => (a) -> IO ((SomeNumber))
absolute a1 =
  withObject a1 $ \a1' -> 
  absolute'_ a1' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 181 "lib/CPython/Protocols/Number.chs" #-}


invert :: Number a => (a) -> IO ((SomeNumber))
invert a1 =
  withObject a1 $ \a1' -> 
  invert'_ a1' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 186 "lib/CPython/Protocols/Number.chs" #-}


shiftL :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
shiftL a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  shiftL'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 192 "lib/CPython/Protocols/Number.chs" #-}


shiftR :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
shiftR a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  shiftR'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 198 "lib/CPython/Protocols/Number.chs" #-}


and :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
and a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  and'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 204 "lib/CPython/Protocols/Number.chs" #-}


xor :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
xor a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  xor'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 210 "lib/CPython/Protocols/Number.chs" #-}


or :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
or a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  or'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 216 "lib/CPython/Protocols/Number.chs" #-}


inPlaceAdd :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
inPlaceAdd a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  inPlaceAdd'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 222 "lib/CPython/Protocols/Number.chs" #-}


inPlaceSubtract :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
inPlaceSubtract a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  inPlaceSubtract'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 228 "lib/CPython/Protocols/Number.chs" #-}


inPlaceMultiply :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
inPlaceMultiply a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  inPlaceMultiply'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 234 "lib/CPython/Protocols/Number.chs" #-}


inPlaceFloorDivide :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
inPlaceFloorDivide a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  inPlaceFloorDivide'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 240 "lib/CPython/Protocols/Number.chs" #-}


inPlaceTrueDivide :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
inPlaceTrueDivide a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  inPlaceTrueDivide'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 246 "lib/CPython/Protocols/Number.chs" #-}


inPlaceRemainder :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
inPlaceRemainder a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  inPlaceRemainder'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 252 "lib/CPython/Protocols/Number.chs" #-}


inPlacePower ::(Number a, Number b, Number c) => a -> b -> Maybe c -> IO SomeNumber
inPlacePower a b mc =
  withObject a $ \aPtr ->
  withObject b $ \bPtr ->
  maybe none (return . toObject) mc >>= \c ->
  withObject c $ \cPtr ->
  pyNumberInPlacePower aPtr bPtr cPtr
  >>= stealObject

inPlaceShiftL :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
inPlaceShiftL :: a -> b -> IO SomeNumber
inPlaceShiftL a1 :: a
a1 a2 :: b
a2 =
  a -> (Ptr () -> IO SomeNumber) -> IO SomeNumber
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject a
a1 ((Ptr () -> IO SomeNumber) -> IO SomeNumber)
-> (Ptr () -> IO SomeNumber) -> IO SomeNumber
forall a b. (a -> b) -> a -> b
$ \a1' :: Ptr ()
a1' -> 
  b -> (Ptr () -> IO SomeNumber) -> IO SomeNumber
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject b
a2 ((Ptr () -> IO SomeNumber) -> IO SomeNumber)
-> (Ptr () -> IO SomeNumber) -> IO SomeNumber
forall a b. (a -> b) -> a -> b
$ \a2' :: Ptr ()
a2' -> 
  Ptr () -> Ptr () -> IO (Ptr ())
inPlaceShiftL'_ Ptr ()
a1' Ptr ()
a2' IO (Ptr ()) -> (Ptr () -> IO SomeNumber) -> IO SomeNumber
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res :: Ptr ()
res ->
  Ptr () -> IO SomeNumber
forall obj a. Object obj => Ptr a -> IO obj
stealObject Ptr ()
res IO SomeNumber -> (SomeNumber -> IO SomeNumber) -> IO SomeNumber
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res' :: SomeNumber
res' ->
  SomeNumber -> IO SomeNumber
forall (m :: * -> *) a. Monad m => a -> m a
return (SomeNumber
res')

{-# LINE 267 "lib/CPython/Protocols/Number.chs" #-}


inPlaceShiftR :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
inPlaceShiftR a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  inPlaceShiftR'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 273 "lib/CPython/Protocols/Number.chs" #-}


inPlaceAnd :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
inPlaceAnd a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  inPlaceAnd'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 279 "lib/CPython/Protocols/Number.chs" #-}


inPlaceXor :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
inPlaceXor a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  inPlaceXor'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 285 "lib/CPython/Protocols/Number.chs" #-}


inPlaceOr :: (Number a, Number b) => (a) -> (b) -> IO ((SomeNumber))
inPlaceOr a1 a2 =
  withObject a1 $ \a1' -> 
  withObject a2 $ \a2' -> 
  inPlaceOr'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 291 "lib/CPython/Protocols/Number.chs" #-}


toInteger :: Number a => (a) -> IO ((Integer))
toInteger a1 =
  withObject a1 $ \a1' -> 
  toInteger'_ a1' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 296 "lib/CPython/Protocols/Number.chs" #-}


toFloat :: Number a => (a) -> IO ((Float))
toFloat a1 =
  withObject a1 $ \a1' -> 
  toFloat'_ a1' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 301 "lib/CPython/Protocols/Number.chs" #-}


toBase :: Number a => (a) -> (Prelude.Integer) -> IO ((Unicode))
toBase a1 a2 =
  withObject a1 $ \a1' -> 
  let {a2' = fromIntegral a2} in 
  toBase'_ a1' a2' >>= \res ->
  stealObject res >>= \res' ->
  return (res')

{-# LINE 307 "lib/CPython/Protocols/Number.chs" #-}


foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Check"
  pyNumberCheck :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Add"
  c_add'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Subtract"
  subtract'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Multiply"
  multiply'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_FloorDivide"
  floorDivide'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_TrueDivide"
  trueDivide'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Remainder"
  remainder'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Divmod"
  divmod'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Power"
  pyNumberPower :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Negative"
  negative'_ :: ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Positive"
  positive'_ :: ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Absolute"
  absolute'_ :: ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Invert"
  invert'_ :: ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Lshift"
  shiftL'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Rshift"
  shiftR'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_And"
  and'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Xor"
  xor'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Or"
  or'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_InPlaceAdd"
  inPlaceAdd'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_InPlaceSubtract"
  inPlaceSubtract'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_InPlaceMultiply"
  inPlaceMultiply'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_InPlaceFloorDivide"
  inPlaceFloorDivide'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_InPlaceTrueDivide"
  inPlaceTrueDivide'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_InPlaceRemainder"
  inPlaceRemainder'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_InPlacePower"
  pyNumberInPlacePower :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_InPlaceLshift"
  inPlaceShiftL'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_InPlaceRshift"
  inPlaceShiftR'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_InPlaceAnd"
  inPlaceAnd'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_InPlaceXor"
  inPlaceXor'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_InPlaceOr"
  inPlaceOr'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Long"
  toInteger'_ :: ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_Float"
  toFloat'_ :: ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))

foreign import ccall safe "CPython/Protocols/Number.chs.h PyNumber_ToBase"
  toBase'_ :: ((C2HSImp.Ptr ()) -> (C2HSImp.CInt -> (IO (C2HSImp.Ptr ()))))