{-# language ConstraintKinds #-}
{-# language MultiParamTypeClasses #-}
{-# language TemplateHaskell #-}

{-# OPTIONS_GHC -fno-warn-orphans #-}

module OpenCV.Core.Types.Rect
  ( Rect
  , HRect(..)

  , RectPoint
  , RectSize
  , IsRect(..)

  , Rect2i
  , Rect2f
  , Rect2d

  , fmapRect
  ) where

import "base" Data.Int ( Int32 )
import "base" Foreign.C.Types
import qualified "inline-c"     Language.C.Inline as C
import qualified "inline-c-cpp" Language.C.Inline.Cpp as C ( using )
import "this" OpenCV.Internal.C.Inline ( openCvCtx )
import "this" OpenCV.Internal.C.Types
import "this" OpenCV.Internal.Core.Types.Rect
import "this" OpenCV.Internal.Core.Types.Rect.TH

--------------------------------------------------------------------------------

C.context openCvCtx
C.include "opencv2/core.hpp"
C.using "namespace cv"

mkRectType "Rect2i" ''Int32   "int32_t" "Point2i" "Size2i"
mkRectType "Rect2f" ''CFloat  "float"   "Point2f" "Size2f"
mkRectType "Rect2d" ''CDouble "double"  "Point2d" "Size2d"

fmapRect :: forall a b. (IsRect Rect a, IsRect HRect a, IsRect Rect b, IsRect HRect b)
   => (a -> b) -> Rect a -> Rect b
fmapRect f r = toRect hrB
  where
    hrA :: HRect a
    hrA = fromRect r

    hrB :: HRect b
    hrB = fmap f hrA