{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NegativeLiterals #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
-- |
-- Module      : Graphics.Color.Model.RGB
-- Copyright   : (c) Alexey Kuleshevich 2018-2025
-- License     : BSD3
-- Maintainer  : Alexey Kuleshevich <lehins@yandex.ru>
-- Stability   : experimental
-- Portability : non-portable
--
module Graphics.Color.Model.RGB
  ( RGB
  -- * Constructors for an RGB color model.
  , pattern ColorRGB
  , pattern ColorRGBA
  , pattern RGB
  , Color
  , ColorModel(..)
  ) where

import Data.List.NonEmpty
import Foreign.Storable
import Graphics.Color.Algebra
import Graphics.Color.Model.Internal

-- | The most common @RGB@ color model
data RGB


-- | `RGB` color model
newtype instance Color RGB e = RGB (V3 e)

-- | Constructor for @RGB@ with alpha channel.
pattern ColorRGB :: e -> e -> e -> Color RGB e
pattern $mColorRGB :: forall {r} {e}.
Color RGB e -> (e -> e -> e -> r) -> ((# #) -> r) -> r
$bColorRGB :: forall e. e -> e -> e -> Color RGB e
ColorRGB r g b = RGB (V3 r g b)
{-# COMPLETE ColorRGB #-}

-- | Constructor for @RGB@ with alpha channel.
pattern ColorRGBA :: e -> e -> e -> e -> Color (Alpha RGB) e
pattern $mColorRGBA :: forall {r} {e}.
Color (Alpha RGB) e -> (e -> e -> e -> e -> r) -> ((# #) -> r) -> r
$bColorRGBA :: forall e. e -> e -> e -> e -> Color (Alpha RGB) e
ColorRGBA r g b a = Alpha (RGB (V3 r g b)) a
{-# COMPLETE ColorRGBA #-}

-- | `RGB` color model
deriving instance Eq e => Eq (Color RGB e)
-- | `RGB` color model
deriving instance Ord e => Ord (Color RGB e)
-- | `RGB` color model
instance Elevator e => Show (Color RGB e) where
  showsPrec :: Int -> Color RGB e -> ShowS
showsPrec Int
_ = Color RGB e -> ShowS
forall cs e. ColorModel cs e => Color cs e -> ShowS
showsColorModel

-- | `RGB` color model
instance Elevator e => ColorModel RGB e where
  type Components RGB e = (e, e, e)
  type ChannelCount RGB = 3
  channelCount :: Proxy (Color RGB e) -> Word8
channelCount Proxy (Color RGB e)
_ = Word8
3
  {-# INLINE channelCount #-}
  channelNames :: Proxy (Color RGB e) -> NonEmpty String
channelNames Proxy (Color RGB e)
_ = String
"Red" String -> [String] -> NonEmpty String
forall a. a -> [a] -> NonEmpty a
:| [String
"Green", String
"Blue"]
  channelColors :: Proxy (Color RGB e) -> NonEmpty (V3 Word8)
channelColors Proxy (Color RGB e)
_ = Word8 -> Word8 -> Word8 -> V3 Word8
forall a. a -> a -> a -> V3 a
V3 Word8
0xff Word8
0x00 Word8
0x00 V3 Word8 -> [V3 Word8] -> NonEmpty (V3 Word8)
forall a. a -> [a] -> NonEmpty a
:|
                  [ Word8 -> Word8 -> Word8 -> V3 Word8
forall a. a -> a -> a -> V3 a
V3 Word8
0x00 Word8
0xff Word8
0x00
                  , Word8 -> Word8 -> Word8 -> V3 Word8
forall a. a -> a -> a -> V3 a
V3 Word8
0x00 Word8
0x00 Word8
0xff
                  ]
  toComponents :: Color RGB e -> Components RGB e
toComponents (ColorRGB e
r e
g e
b) = (e
r, e
g, e
b)
  {-# INLINE toComponents #-}
  fromComponents :: Components RGB e -> Color RGB e
fromComponents (e
r, e
g, e
b) = e -> e -> e -> Color RGB e
forall e. e -> e -> e -> Color RGB e
ColorRGB e
r e
g e
b
  {-# INLINE fromComponents #-}

-- | `RGB` color model
deriving instance Functor (Color RGB)
-- | `RGB` color model
deriving instance Applicative (Color RGB)
-- | `RGB` color model
deriving instance Foldable (Color RGB)
-- | `RGB` color model
deriving instance Traversable (Color RGB)
-- | `RGB` color model
deriving instance Storable e => Storable (Color RGB e)