module Physics.ODE.Space
       (createSimple, createHash, destroySpace, setLevels, getLevels,
        setCleanup, getCleanup, add, remove, query, getNumGeoms,
        getGeomUnsafe, tryGetGeom, getGeom)
       where
import Foreign
import Data.Maybe
import Physics.ODE.Types
 
tryGetGeom :: Space -> Int -> IO (Maybe Geom)
tryGetGeom space nth
  = do num <- getNumGeoms space
       if nth > num - 1 then return Nothing else
         fmap Just (getGeomUnsafe space nth)
 
getGeom :: Space -> Int -> IO Geom
getGeom space nth
  = fmap (fromMaybe (error msg)) (tryGetGeom space nth)
  where msg
          = "Physics.ODE.Space.getGeom: Index (" ++ show nth ++
              ") out of range."
createSimple :: Maybe Space -> IO Space
createSimple = \arg_0 -> (case arg_0 of
                              Data.Maybe.Just a_1 -> \action_2 -> action_2 a_1
                              Data.Maybe.Nothing -> \action_3 -> action_3 nullPtr) (\marshaledArg_4 -> do ret_5 <- createSimpledSimpleSpaceCreate marshaledArg_4
                                                                                                          return (ret_5))
foreign import ccall unsafe "dSimpleSpaceCreate" createSimpledSimpleSpaceCreate :: Space ->
                                                                                   IO Space
createHash :: Maybe Space -> IO Space
createHash = \arg_0 -> (case arg_0 of
                            Data.Maybe.Just a_1 -> \action_2 -> action_2 a_1
                            Data.Maybe.Nothing -> \action_3 -> action_3 nullPtr) (\marshaledArg_4 -> do ret_5 <- createHashdHashSpaceCreate marshaledArg_4
                                                                                                        return (ret_5))
foreign import ccall unsafe "dHashSpaceCreate" createHashdHashSpaceCreate :: Space ->
                                                                             IO Space
destroySpace :: Space -> IO ()
destroySpace = \arg_0 -> (\action_1 -> action_1 arg_0) (\marshaledArg_2 -> do ret_3 <- destroySpacedSpaceDestroy marshaledArg_2
                                                                              case () of
                                                                                  () -> do return ())
foreign import ccall unsafe "dSpaceDestroy" destroySpacedSpaceDestroy :: Space ->
                                                                         IO ()
setLevels :: Space -> Int -> Int -> IO ()
setLevels = \arg_0 arg_1 arg_2 -> (\action_3 -> action_3 arg_0) (\marshaledArg_4 -> (\action_5 -> action_5 arg_1) (\marshaledArg_6 -> (\action_7 -> action_7 arg_2) (\marshaledArg_8 -> do ret_9 <- setLevelsdHashSpaceSetLevels marshaledArg_4 marshaledArg_6 marshaledArg_8
                                                                                                                                                                                           case () of
                                                                                                                                                                                               () -> do return ())))
foreign import ccall unsafe "dHashSpaceSetLevels" setLevelsdHashSpaceSetLevels :: Space ->
                                                                                  Int ->
                                                                                  Int -> IO ()
getLevels :: Space -> IO ((Int, Int))
getLevels = \arg_0 -> (\action_1 -> action_1 arg_0) (\marshaledArg_2 -> alloca (\marshaledArg_3 -> alloca (\marshaledArg_4 -> do ret_5 <- getLevelsdHashSpaceGetLevels marshaledArg_2 marshaledArg_3 marshaledArg_4
                                                                                                                                 case (marshaledArg_3,
                                                                                                                                       marshaledArg_4) of
                                                                                                                                     (tuplePart_6,
                                                                                                                                      tuplePart_7) -> do returnVariable_8 <- do n_9 <- peek tuplePart_6
                                                                                                                                                                                return n_9
                                                                                                                                                         returnVariable_10 <- do n_11 <- peek tuplePart_7
                                                                                                                                                                                 return n_11
                                                                                                                                                         return (returnVariable_8,
                                                                                                                                                                 returnVariable_10))))
foreign import ccall unsafe "dHashSpaceGetLevels" getLevelsdHashSpaceGetLevels :: Space ->
                                                                                  Ptr Int ->
                                                                                  Ptr Int -> IO ()
setCleanup :: Space -> Bool -> IO ()
setCleanup = \arg_0 arg_1 -> (\action_2 -> action_2 arg_0) (\marshaledArg_3 -> (\action_4 -> action_4 (fromBool arg_1)) (\marshaledArg_5 -> do ret_6 <- setCleanupdSpaceSetCleanup marshaledArg_3 marshaledArg_5
                                                                                                                                               case () of
                                                                                                                                                   () -> do return ()))
foreign import ccall unsafe "dSpaceSetCleanup" setCleanupdSpaceSetCleanup :: Space ->
                                                                             Int -> IO ()
getCleanup :: Space -> IO Bool
getCleanup = \arg_0 -> (\action_1 -> action_1 arg_0) (\marshaledArg_2 -> do ret_3 <- getCleanupdSpaceGetCleanup marshaledArg_2
                                                                            return (toBool (ret_3)))
foreign import ccall unsafe "dSpaceGetCleanup" getCleanupdSpaceGetCleanup :: Space ->
                                                                             IO Int
add :: Space -> Geom -> IO ()
add = \arg_0 arg_1 -> (\action_2 -> action_2 arg_0) (\marshaledArg_3 -> (\action_4 -> action_4 arg_1) (\marshaledArg_5 -> do ret_6 <- adddSpaceAdd marshaledArg_3 marshaledArg_5
                                                                                                                             case () of
                                                                                                                                 () -> do return ()))
foreign import ccall unsafe "dSpaceAdd" adddSpaceAdd :: Space ->
                                                        Geom -> IO ()
remove :: Space -> Geom -> IO ()
remove = \arg_0 arg_1 -> (\action_2 -> action_2 arg_0) (\marshaledArg_3 -> (\action_4 -> action_4 arg_1) (\marshaledArg_5 -> do ret_6 <- removedSpaceRemove marshaledArg_3 marshaledArg_5
                                                                                                                                case () of
                                                                                                                                    () -> do return ()))
foreign import ccall unsafe "dSpaceRemove" removedSpaceRemove :: Space ->
                                                                 Geom -> IO ()
query :: Space -> Geom -> IO Bool
query = \arg_0 arg_1 -> (\action_2 -> action_2 arg_0) (\marshaledArg_3 -> (\action_4 -> action_4 arg_1) (\marshaledArg_5 -> do ret_6 <- querydSpaceQuery marshaledArg_3 marshaledArg_5
                                                                                                                               return (toBool (ret_6))))
foreign import ccall unsafe "dSpaceQuery" querydSpaceQuery :: Space ->
                                                              Geom -> IO Int
getNumGeoms :: Space -> IO Int
getNumGeoms = \arg_0 -> (\action_1 -> action_1 arg_0) (\marshaledArg_2 -> do ret_3 <- getNumGeomsdSpaceGetNumGeoms marshaledArg_2
                                                                             return (ret_3))
foreign import ccall unsafe "dSpaceGetNumGeoms" getNumGeomsdSpaceGetNumGeoms :: Space ->
                                                                                IO Int
getGeomUnsafe :: Space -> Int -> IO Geom
getGeomUnsafe = \arg_0 arg_1 -> (\action_2 -> action_2 arg_0) (\marshaledArg_3 -> (\action_4 -> action_4 arg_1) (\marshaledArg_5 -> do ret_6 <- getGeomUnsafedSpaceGetGeom marshaledArg_3 marshaledArg_5
                                                                                                                                       return (ret_6)))
foreign import ccall unsafe "dSpaceGetGeom" getGeomUnsafedSpaceGetGeom :: Space ->
                                                                          Int -> IO Geom