{-# LANGUAGE CApiFFI #-}
module OpenCascade.ShapeConstruct.Curve
( Curve
, new
, convertToBSpline
) where

import OpenCascade.ShapeConstruct.Types (Curve)
import OpenCascade.ShapeConstruct.Internal.Destructors (deleteCurve)
import qualified OpenCascade.Geom.Types as Geom
import OpenCascade.Geom.Internal.Destructors (deleteHandleBSplineCurve)
import OpenCascade.Handle (Handle)
import Foreign.Ptr
import Foreign.C (CDouble (..))
import Data.Acquire (Acquire, mkAcquire)
import Data.Coerce (coerce)

foreign import capi unsafe "hs_ShapeConstruct_Curve.h hs_new_ShapeConstruct_Curve" rawNew :: IO (Ptr Curve)

new :: Acquire (Ptr Curve)
new :: Acquire (Ptr Curve)
new = IO (Ptr Curve) -> (Ptr Curve -> IO ()) -> Acquire (Ptr Curve)
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire IO (Ptr Curve)
rawNew Ptr Curve -> IO ()
deleteCurve

foreign import capi unsafe "hs_ShapeConstruct_Curve.h hs_ShapeConstruct_Curve_convertToBSpline" rawConvertToBSpline :: Ptr Curve -> Ptr (Handle Geom.Curve) -> CDouble -> CDouble -> CDouble -> IO (Ptr (Handle Geom.BSplineCurve))

convertToBSpline :: Ptr Curve -> Ptr (Handle Geom.Curve) -> Double -> Double -> Double -> Acquire (Ptr (Handle Geom.BSplineCurve))
convertToBSpline :: Ptr Curve
-> Ptr (Handle Curve)
-> Double
-> Double
-> Double
-> Acquire (Ptr (Handle BSplineCurve))
convertToBSpline Ptr Curve
shapeConstruct Ptr (Handle Curve)
handleCurve Double
firstParam Double
lastParam Double
precision = 
    IO (Ptr (Handle BSplineCurve))
-> (Ptr (Handle BSplineCurve) -> IO ())
-> Acquire (Ptr (Handle BSplineCurve))
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire (Ptr Curve
-> Ptr (Handle Curve)
-> CDouble
-> CDouble
-> CDouble
-> IO (Ptr (Handle BSplineCurve))
rawConvertToBSpline Ptr Curve
shapeConstruct Ptr (Handle Curve)
handleCurve (Double -> CDouble
forall a b. Coercible a b => a -> b
coerce Double
firstParam) (Double -> CDouble
forall a b. Coercible a b => a -> b
coerce Double
lastParam) (Double -> CDouble
forall a b. Coercible a b => a -> b
coerce Double
precision)) Ptr (Handle BSplineCurve) -> IO ()
deleteHandleBSplineCurve