{-# LANGUAGE CApiFFI #-}
module OpenCascade.Geom.BezierCurve 
( fromPnts
, toHandle
, nbPoles
, pole
, isRational
, segment
) where
import Foreign.Ptr
import Foreign.C (CInt (..), CBool (..), CDouble (..))
import Data.Acquire
import Data.Coerce (coerce)
import OpenCascade.Geom.Types (BezierCurve)
import OpenCascade.Geom.Internal.Destructors (deleteBezierCurve, deleteHandleBezierCurve)
import OpenCascade.GP.Internal.Destructors (deletePnt)
import OpenCascade.GP (Pnt)
import OpenCascade.NCollection (Array1)
import OpenCascade.Handle (Handle)
import OpenCascade.Internal.Bool (cBoolToBool)


foreign import capi unsafe "hs_Geom_BezierCurve.h hs_new_Geom_BezierCurve_fromPnts" rawFromPnts :: Ptr (Array1 Pnt) -> IO(Ptr BezierCurve)

fromPnts :: Ptr (Array1 Pnt) -> Acquire (Ptr BezierCurve)
fromPnts :: Ptr (Array1 Pnt) -> Acquire (Ptr BezierCurve)
fromPnts Ptr (Array1 Pnt)
arr = IO (Ptr BezierCurve)
-> (Ptr BezierCurve -> IO ()) -> Acquire (Ptr BezierCurve)
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire (Ptr (Array1 Pnt) -> IO (Ptr BezierCurve)
rawFromPnts Ptr (Array1 Pnt)
arr) (Ptr BezierCurve -> IO ()
deleteBezierCurve)

foreign import capi unsafe "hs_Geom_BezierCurve.h hs_Geom_BezierCurve_toHandle" rawToHandle :: Ptr BezierCurve -> IO (Ptr (Handle BezierCurve))

toHandle :: Ptr BezierCurve -> Acquire (Ptr (Handle BezierCurve))
toHandle :: Ptr BezierCurve -> Acquire (Ptr (Handle BezierCurve))
toHandle Ptr BezierCurve
curve = IO (Ptr (Handle BezierCurve))
-> (Ptr (Handle BezierCurve) -> IO ())
-> Acquire (Ptr (Handle BezierCurve))
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire (Ptr BezierCurve -> IO (Ptr (Handle BezierCurve))
rawToHandle Ptr BezierCurve
curve) Ptr (Handle BezierCurve) -> IO ()
deleteHandleBezierCurve


foreign import capi unsafe "hs_Geom_BezierCurve.h hs_Geom_BezierCurve_nbPoles" rawNbPoles :: Ptr (Handle BezierCurve) -> IO (CInt)

nbPoles :: Ptr (Handle (BezierCurve)) -> IO Int 
nbPoles :: Ptr (Handle BezierCurve) -> IO Int
nbPoles Ptr (Handle BezierCurve)
h = CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr (Handle BezierCurve) -> IO CInt
rawNbPoles Ptr (Handle BezierCurve)
h

foreign import capi unsafe "hs_Geom_BezierCurve.h hs_Geom_BezierCurve_pole" rawPole :: Ptr (Handle BezierCurve) -> CInt -> IO (Ptr Pnt)

pole :: Ptr (Handle BezierCurve) -> Int -> Acquire (Ptr Pnt)
pole :: Ptr (Handle BezierCurve) -> Int -> Acquire (Ptr Pnt)
pole Ptr (Handle BezierCurve)
h Int
n = IO (Ptr Pnt) -> (Ptr Pnt -> IO ()) -> Acquire (Ptr Pnt)
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire (Ptr (Handle BezierCurve) -> CInt -> IO (Ptr Pnt)
rawPole Ptr (Handle BezierCurve)
h (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)) Ptr Pnt -> IO ()
deletePnt

foreign import capi unsafe "hs_Geom_BezierCurve.h hs_Geom_BezierCurve_isRational" rawIsRational :: Ptr (Handle BezierCurve) -> IO (CBool)

isRational :: Ptr (Handle (BezierCurve)) -> IO Bool
isRational :: Ptr (Handle BezierCurve) -> IO Bool
isRational Ptr (Handle BezierCurve)
h = CBool -> Bool
cBoolToBool (CBool -> Bool) -> IO CBool -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr (Handle BezierCurve) -> IO CBool
rawIsRational Ptr (Handle BezierCurve)
h

foreign import capi unsafe "hs_Geom_BezierCurve.h hs_Geom_BezierCurve_segment" rawSegment :: Ptr (Handle BezierCurve) -> CDouble -> CDouble -> IO ()

segment :: Ptr (Handle BezierCurve) -> Double -> Double -> IO ()
segment :: Ptr (Handle BezierCurve) -> Double -> Double -> IO ()
segment = (Ptr (Handle BezierCurve) -> CDouble -> CDouble -> IO ())
-> Ptr (Handle BezierCurve) -> Double -> Double -> IO ()
forall a b. Coercible a b => a -> b
coerce Ptr (Handle BezierCurve) -> CDouble -> CDouble -> IO ()
rawSegment