{-# 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 Double
getRGBNeedle :: RGB  } deriving (ColourNeedle -> ColourNeedle -> Bool
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
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 Double
asV3Needle = forall s v w. (v -> w) -> LinearFunction s v w
LinearFunction forall a b. (a -> b) -> a -> b
$ \(ColourNeedle (RGB Double
r Double
g Double
b)) -> forall a. a -> a -> a -> V3 a
V3 Double
r Double
g Double
b

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


newtype ColourBoundary = ColourBoundarySphere {
   ColourBoundary -> S²
getColourBounarySphere ::  -- ^ Corresponds to an inflated version of the HSL bicone
  }
 deriving (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
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
Semimanifold, Semimanifold ColourBoundary
PseudoAffineWitness ColourBoundary
HasCallStack =>
ColourBoundary -> ColourBoundary -> Needle 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
.-~! :: HasCallStack =>
ColourBoundary -> ColourBoundary -> Needle ColourBoundary
$c.-~! :: HasCallStack =>
ColourBoundary -> ColourBoundary -> Needle ColourBoundary
.-~. :: ColourBoundary -> ColourBoundary -> Maybe (Needle ColourBoundary)
$c.-~. :: ColourBoundary -> ColourBoundary -> Maybe (Needle ColourBoundary)
PseudoAffine, ColourBoundary -> ColourBoundary -> Bool
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
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. 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)