{-# language ConstraintKinds #-}
{-# language MultiParamTypeClasses #-}
{-# language UndecidableInstances #-}

module OpenCV.Internal.Core.Types.Size
  ( Size(..)
  , IsSize(..)
  ) where

import "base" Foreign.ForeignPtr ( ForeignPtr, withForeignPtr )
import "linear" Linear ( V2 )
import "this" OpenCV.Internal.C.Types

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

newtype Size (depth :: *)
      = Size {unSize :: ForeignPtr (C'Size depth)}

type instance C (Size depth) = C'Size depth

instance WithPtr (Size depth) where
    withPtr = withForeignPtr . unSize

class IsSize (p :: * -> *) (depth :: *)  where
    toSize   :: p depth -> Size depth
    fromSize :: Size depth -> p depth

    toSizeIO :: p depth -> IO (Size depth)
    toSizeIO = pure . toSize

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

instance (IsSize V2 a, Show a)
      => Show (Size a) where
    showsPrec prec size =
        showParen (prec >= 10)
        $ showString "toSize "
        . showParen True (shows v2)
      where
        v2 :: V2 a
        v2 = fromSize size
