{-# LANGUAGE CApiFFI #-}
module OpenCascade.TopExp.Explorer
( Explorer
, new
, more
, next
, value
) where

import OpenCascade.TopExp.Types (Explorer)
import OpenCascade.TopExp.Internal.Destructors (deleteExplorer)
import qualified OpenCascade.TopoDS as TopoDS
import qualified OpenCascade.TopAbs as TopAbs
import Data.Acquire
import Foreign.Ptr
import Foreign.C
import OpenCascade.Internal.Bool (cBoolToBool)

foreign import capi unsafe "hs_TopExp_Explorer.h hs_new_TopExp_Explorer" rawNew :: Ptr TopoDS.Shape -> CInt -> IO (Ptr Explorer)

new :: Ptr TopoDS.Shape -> TopAbs.ShapeEnum -> Acquire (Ptr Explorer)
new :: Ptr Shape -> ShapeEnum -> Acquire (Ptr Explorer)
new Ptr Shape
shape ShapeEnum
theType = IO (Ptr Explorer)
-> (Ptr Explorer -> IO ()) -> Acquire (Ptr Explorer)
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire (Ptr Shape -> CInt -> IO (Ptr Explorer)
rawNew Ptr Shape
shape (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> CInt) -> (ShapeEnum -> Int) -> ShapeEnum -> CInt
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShapeEnum -> Int
forall a. Enum a => a -> Int
fromEnum (ShapeEnum -> CInt) -> ShapeEnum -> CInt
forall a b. (a -> b) -> a -> b
$ ShapeEnum
theType)) Ptr Explorer -> IO ()
deleteExplorer

foreign import capi unsafe "hs_TopExp_Explorer.h hs_TopExp_Explorer_more" rawMore :: Ptr Explorer -> IO (CBool)

more :: Ptr Explorer -> IO Bool
more :: Ptr Explorer -> IO Bool
more = (CBool -> Bool) -> IO CBool -> IO Bool
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (CBool -> Bool
cBoolToBool) (IO CBool -> IO Bool)
-> (Ptr Explorer -> IO CBool) -> Ptr Explorer -> IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr Explorer -> IO CBool
rawMore 

foreign import capi unsafe "hs_TopExp_Explorer.h hs_TopExp_Explorer_next" next :: Ptr Explorer -> IO ()

foreign import capi unsafe "hs_TopExp_Explorer.h hs_TopExp_Explorer_value" value :: Ptr Explorer -> IO (Ptr TopoDS.Shape)