{-# LANGUAGE TypeFamilies         #-}
{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleContexts     #-}
{-# LANGUAGE TypeOperators        #-}
{-# LANGUAGE TypeApplications     #-}
{-# LANGUAGE UnicodeSyntax        #-}
{-# LANGUAGE ScopedTypeVariables  #-}
{-# LANGUAGE TemplateHaskell      #-}
{-# LANGUAGE Rank2Types           #-}
{-# LANGUAGE DeriveGeneric        #-}
{-# LANGUAGE DeriveAnyClass       #-}
{-# LANGUAGE EmptyCase            #-}
{-# LANGUAGE CPP                  #-}

module Data.Colour.Manifold.Internal where

import Data.Colour.SRGB.Linear
import Data.Manifold.Types
import Math.LinearMap.Category
import Linear.V3
import GHC.Generics

newtype ColourNeedle = ColourNeedle { ColourNeedle -> RGB ℝ
getRGBNeedle :: RGB  } deriving (ColourNeedle -> ColourNeedle -> Bool
(ColourNeedle -> ColourNeedle -> Bool)
-> (ColourNeedle -> ColourNeedle -> Bool) -> Eq ColourNeedle
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ColourNeedle -> ColourNeedle -> Bool
$c/= :: ColourNeedle -> ColourNeedle -> Bool
== :: ColourNeedle -> ColourNeedle -> Bool
$c== :: ColourNeedle -> ColourNeedle -> Bool
Eq, Int -> ColourNeedle -> ShowS
[ColourNeedle] -> ShowS
ColourNeedle -> String
(Int -> ColourNeedle -> ShowS)
-> (ColourNeedle -> String)
-> ([ColourNeedle] -> ShowS)
-> Show ColourNeedle
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ColourNeedle] -> ShowS
$cshowList :: [ColourNeedle] -> ShowS
show :: ColourNeedle -> String
$cshow :: ColourNeedle -> String
showsPrec :: Int -> ColourNeedle -> ShowS
$cshowsPrec :: Int -> ColourNeedle -> ShowS
Show)

asV3Needle :: ColourNeedle -+> V3 
asV3Needle :: ColourNeedle -+> V3 ℝ
asV3Needle = (ColourNeedle -> V3 ℝ) -> LinearFunction ℝ ColourNeedle (V3 ℝ)
forall s v w. (v -> w) -> LinearFunction s v w
LinearFunction ((ColourNeedle -> V3 ℝ) -> LinearFunction ℝ ColourNeedle (V3 ℝ))
-> (ColourNeedle -> V3 ℝ) -> LinearFunction ℝ ColourNeedle (V3 ℝ)
forall a b. (a -> b) -> a -> b
$ \(ColourNeedle (RGB r g b)) -> ℝ -> ℝ -> ℝ -> V3 ℝ
forall a. a -> a -> a -> V3 a
V3 r g b

fromV3Needle :: V3  -+> ColourNeedle
fromV3Needle :: V3 ℝ -+> ColourNeedle
fromV3Needle = (V3 ℝ -> ColourNeedle) -> V3 ℝ -+> ColourNeedle
forall s v w. (v -> w) -> LinearFunction s v w
LinearFunction ((V3 ℝ -> ColourNeedle) -> V3 ℝ -+> ColourNeedle)
-> (V3 ℝ -> ColourNeedle) -> V3 ℝ -+> ColourNeedle
forall a b. (a -> b) -> a -> b
$ \(V3 r g b) -> RGB ℝ -> ColourNeedle
ColourNeedle (RGB ℝ -> ColourNeedle) -> RGB ℝ -> ColourNeedle
forall a b. (a -> b) -> a -> b
$ ℝ -> ℝ -> ℝ -> RGB ℝ
forall a. a -> a -> a -> RGB a
RGB r g b


newtype ColourBoundary = ColourBoundarySphere {
   ColourBoundary -> S²
getColourBounarySphere ::  -- ^ Corresponds to an inflated version of the HSL bicone
  }
 deriving ((forall x. ColourBoundary -> Rep ColourBoundary x)
-> (forall x. Rep ColourBoundary x -> ColourBoundary)
-> Generic ColourBoundary
forall x. Rep ColourBoundary x -> ColourBoundary
forall x. ColourBoundary -> Rep ColourBoundary x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ColourBoundary x -> ColourBoundary
$cfrom :: forall x. ColourBoundary -> Rep ColourBoundary x
Generic, AdditiveGroup (Needle ColourBoundary)
SemimanifoldWitness ColourBoundary
AdditiveGroup (Needle ColourBoundary)
-> (ColourBoundary -> Needle ColourBoundary -> ColourBoundary)
-> (ColourBoundary -> Needle ColourBoundary -> ColourBoundary)
-> SemimanifoldWitness ColourBoundary
-> Semimanifold ColourBoundary
ColourBoundary -> Needle ColourBoundary -> ColourBoundary
forall x.
AdditiveGroup (Needle x)
-> (x -> Needle x -> x)
-> (x -> Needle x -> x)
-> SemimanifoldWitness x
-> Semimanifold x
semimanifoldWitness :: SemimanifoldWitness ColourBoundary
$csemimanifoldWitness :: SemimanifoldWitness ColourBoundary
.-~^ :: ColourBoundary -> Needle ColourBoundary -> ColourBoundary
$c.-~^ :: ColourBoundary -> Needle ColourBoundary -> ColourBoundary
.+~^ :: ColourBoundary -> Needle ColourBoundary -> ColourBoundary
$c.+~^ :: ColourBoundary -> Needle ColourBoundary -> ColourBoundary
$cp1Semimanifold :: AdditiveGroup (Needle ColourBoundary)
Semimanifold, Semimanifold ColourBoundary
PseudoAffineWitness ColourBoundary
HasCallStack =>
ColourBoundary -> ColourBoundary -> Needle ColourBoundary
Semimanifold ColourBoundary
-> (ColourBoundary
    -> ColourBoundary -> Maybe (Needle ColourBoundary))
-> (HasCallStack =>
    ColourBoundary -> ColourBoundary -> Needle ColourBoundary)
-> PseudoAffineWitness ColourBoundary
-> PseudoAffine ColourBoundary
ColourBoundary -> ColourBoundary -> Maybe (Needle ColourBoundary)
forall x.
Semimanifold x
-> (x -> x -> Maybe (Needle x))
-> (HasCallStack => x -> x -> Needle x)
-> PseudoAffineWitness x
-> PseudoAffine x
pseudoAffineWitness :: PseudoAffineWitness ColourBoundary
$cpseudoAffineWitness :: PseudoAffineWitness ColourBoundary
.-~! :: ColourBoundary -> ColourBoundary -> Needle ColourBoundary
$c.-~! :: HasCallStack =>
ColourBoundary -> ColourBoundary -> Needle ColourBoundary
.-~. :: ColourBoundary -> ColourBoundary -> Maybe (Needle ColourBoundary)
$c.-~. :: ColourBoundary -> ColourBoundary -> Maybe (Needle ColourBoundary)
$cp1PseudoAffine :: Semimanifold ColourBoundary
PseudoAffine, ColourBoundary -> ColourBoundary -> Bool
(ColourBoundary -> ColourBoundary -> Bool)
-> (ColourBoundary -> ColourBoundary -> Bool) -> Eq ColourBoundary
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ColourBoundary -> ColourBoundary -> Bool
$c/= :: ColourBoundary -> ColourBoundary -> Bool
== :: ColourBoundary -> ColourBoundary -> Bool
$c== :: ColourBoundary -> ColourBoundary -> Bool
Eq, Int -> ColourBoundary -> ShowS
[ColourBoundary] -> ShowS
ColourBoundary -> String
(Int -> ColourBoundary -> ShowS)
-> (ColourBoundary -> String)
-> ([ColourBoundary] -> ShowS)
-> Show ColourBoundary
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ColourBoundary] -> ShowS
$cshowList :: [ColourBoundary] -> ShowS
show :: ColourBoundary -> String
$cshow :: ColourBoundary -> String
showsPrec :: Int -> ColourBoundary -> ShowS
$cshowsPrec :: Int -> ColourBoundary -> ShowS
Show)

data ColourHalfNeedle = ColourHalfNeedle {
         ColourHalfNeedle -> ℝay
colourBoundaryDistance :: !ℝay
       , ColourHalfNeedle -> Needle ColourBoundary
colourBoundaryTangent :: !(Needle ColourBoundary)
       }
   deriving ((forall x. ColourHalfNeedle -> Rep ColourHalfNeedle x)
-> (forall x. Rep ColourHalfNeedle x -> ColourHalfNeedle)
-> Generic ColourHalfNeedle
forall x. Rep ColourHalfNeedle x -> ColourHalfNeedle
forall x. ColourHalfNeedle -> Rep ColourHalfNeedle x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ColourHalfNeedle x -> ColourHalfNeedle
$cfrom :: forall x. ColourHalfNeedle -> Rep ColourHalfNeedle x
Generic)