{-# LANGUAGE CApiFFI #-}
module OpenCascade.Poly.Triangle 
( Triangle
, fromIndices
, value
, setValue
) where

import OpenCascade.Poly.Types (Triangle)
import OpenCascade.Poly.Internal.Destructors (deleteTriangle)
import Foreign.C (CInt (..))
import Foreign.Ptr (Ptr)
import Data.Acquire (Acquire, mkAcquire)

foreign import capi unsafe "hs_Poly_Triangle.h hs_new_Poly_Triangle_fromIndices" rawFromIndices :: CInt -> CInt -> CInt -> IO (Ptr Triangle)

fromIndices :: Int -> Int -> Int -> Acquire (Ptr Triangle)
fromIndices :: Int -> Int -> Int -> Acquire (Ptr Triangle)
fromIndices Int
n1 Int
n2 Int
n3 = IO (Ptr Triangle)
-> (Ptr Triangle -> IO ()) -> Acquire (Ptr Triangle)
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire (CInt -> CInt -> CInt -> IO (Ptr Triangle)
rawFromIndices (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n1) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n2) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n3)) Ptr Triangle -> IO ()
deleteTriangle

foreign import capi unsafe "hs_Poly_Triangle.h hs_Poly_Triangle_value" rawValue :: Ptr Triangle -> CInt -> IO CInt

value :: Ptr Triangle -> Int -> IO Int
value :: Ptr Triangle -> Int -> IO Int
value Ptr Triangle
tri Int
index = 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 Triangle -> CInt -> IO CInt
rawValue Ptr Triangle
tri (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
index)

foreign import capi unsafe "hs_Poly_Triangle.h hs_Poly_Triangle_setValue" rawSetValue :: Ptr Triangle -> CInt -> CInt -> IO ()

setValue :: Ptr Triangle -> Int -> Int -> IO ()
setValue :: Ptr Triangle -> Int -> Int -> IO ()
setValue Ptr Triangle
tri Int
index Int
node = Ptr Triangle -> CInt -> CInt -> IO ()
rawSetValue Ptr Triangle
tri (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
index) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
node)