{-# LANGUAGE UndecidableInstances #-}
module HGeometry.HalfSpace.Class
( HalfSpace_(..)
, HalfPlane_
) where
import Control.Lens
import HGeometry.Ext
import HGeometry.Properties (NumType, Dimension)
import HGeometry.Sign
class ( Dimension halfSpace ~ d, Dimension (BoundingHyperPlane halfSpace d r) ~ d
, NumType halfSpace ~ r, NumType (BoundingHyperPlane halfSpace d r) ~ r
)
=> HalfSpace_ halfSpace d r | halfSpace -> d,
halfSpace -> r where
type BoundingHyperPlane halfSpace d r
boundingHyperPlane :: Lens' halfSpace (BoundingHyperPlane halfSpace d r)
halfSpaceSign :: Lens' halfSpace Sign
type HalfPlane_ halfPlane r = HalfSpace_ halfPlane 2 r
instance HalfSpace_ core d r => HalfSpace_ (core :+ extra) d r where
type BoundingHyperPlane (core :+ extra) d r = BoundingHyperPlane core d r
boundingHyperPlane :: Lens' (core :+ extra) (BoundingHyperPlane (core :+ extra) d r)
boundingHyperPlane = (core -> f core) -> (core :+ extra) -> f (core :+ extra)
forall core extra core' (f :: * -> *).
Functor f =>
(core -> f core') -> (core :+ extra) -> f (core' :+ extra)
core((core -> f core) -> (core :+ extra) -> f (core :+ extra))
-> ((BoundingHyperPlane core d r
-> f (BoundingHyperPlane core d r))
-> core -> f core)
-> (BoundingHyperPlane core d r -> f (BoundingHyperPlane core d r))
-> (core :+ extra)
-> f (core :+ extra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(BoundingHyperPlane core d r -> f (BoundingHyperPlane core d r))
-> core -> f core
forall halfSpace (d :: Nat) r.
HalfSpace_ halfSpace d r =>
Lens' halfSpace (BoundingHyperPlane halfSpace d r)
Lens' core (BoundingHyperPlane core d r)
boundingHyperPlane
halfSpaceSign :: Lens' (core :+ extra) Sign
halfSpaceSign = (core -> f core) -> (core :+ extra) -> f (core :+ extra)
forall core extra core' (f :: * -> *).
Functor f =>
(core -> f core') -> (core :+ extra) -> f (core' :+ extra)
core((core -> f core) -> (core :+ extra) -> f (core :+ extra))
-> ((Sign -> f Sign) -> core -> f core)
-> (Sign -> f Sign)
-> (core :+ extra)
-> f (core :+ extra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Sign -> f Sign) -> core -> f core
forall halfSpace (d :: Nat) r.
HalfSpace_ halfSpace d r =>
Lens' halfSpace Sign
Lens' core Sign
halfSpaceSign