{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module HGeometry.Vector.Class
( AsVector_(..)
, Vector_(..)
, Has_
, generate, vectorFromList
, component
, xComponent, yComponent, zComponent, wComponent
, prefix, suffix
, cons, snoc
, uncons, unsnoc
, Additive_(..), zero, liftI2, lerp, (^+^), (^-^)
, negated, (*^), (^*), (^/), sumV, basis, unit
, foldMapZip
, Metric_(..)
) where
import Control.Lens hiding (cons,snoc,uncons,unsnoc)
import Control.Monad.State
import Control.Monad (guard, replicateM)
import qualified Data.Foldable as F
import qualified Data.Functor.Apply as Apply
import Data.Functor.Classes (readData, readUnaryWith)
import Data.Proxy
import Data.Type.Ord
import GHC.TypeNats
import HGeometry.Properties
import HGeometry.Vector.Type
import Text.Read (Read (..))
import qualified Linear.V1 as Linear
import qualified Linear.V2 as Linear
import qualified Linear.V3 as Linear
import qualified Linear.V4 as Linear
import Prelude hiding (zipWith, head, last)
import System.Random (Random (..))
import System.Random.Stateful (UniformRange(..), Uniform(..), isInRangeOrd)
import qualified HGeometry.Number.Radical as Radical
class ( r ~ IxValue vector
, s ~ IxValue vector'
, d ~ Dimension vector
, d ~ Dimension vector'
) => AsVector_ vector vector' d r s | vector -> d
, vector -> r
, vector' -> s where
_Vector :: Iso vector vector' (Vector d r) (Vector d s)
instance AsVector_ (Vector d r) (Vector d s) d r s where
_Vector :: Iso (Vector d r) (Vector d s) (Vector d r) (Vector d s)
_Vector = p (Vector d r) (f (Vector d s)) -> p (Vector d r) (f (Vector d s))
forall a. a -> a
id
{-# INLINE _Vector #-}
class ( HasComponents vector vector
, AsVector_ vector vector d r r
, KnownNat d
) => Vector_ vector d r where
{-# MINIMAL generateA #-}
generateA :: Applicative f => (Int -> f r) -> f vector
component' :: Int -> IndexedTraversal' Int vector r
default component' :: (Index vector ~ Int, Ixed vector)
=> Int -> IndexedTraversal' Int vector r
component' = Int -> IndexedTraversal' Int vector r
Index vector
-> IndexedTraversal' (Index vector) vector (IxValue vector)
forall m.
Ixed m =>
Index m -> IndexedTraversal' (Index m) m (IxValue m)
iix
{-# INLINE component' #-}
type Has_ c d r = c (Vector d r) d r
generate :: Vector_ vector d r => (Int -> r) -> vector
generate :: forall vector (d :: Nat) r.
Vector_ vector d r =>
(Int -> r) -> vector
generate Int -> r
f = Identity vector -> vector
forall a. Identity a -> a
runIdentity (Identity vector -> vector) -> Identity vector -> vector
forall a b. (a -> b) -> a -> b
$ (Int -> Identity r) -> Identity vector
forall vector (d :: Nat) r (f :: * -> *).
(Vector_ vector d r, Applicative f) =>
(Int -> f r) -> f vector
forall (f :: * -> *). Applicative f => (Int -> f r) -> f vector
generateA (r -> Identity r
forall a. a -> Identity a
Identity (r -> Identity r) -> (Int -> r) -> Int -> Identity r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> r
f)
{-# INLINE generate #-}
vectorFromList :: Vector_ vector d r => [r] -> Maybe vector
vectorFromList :: forall vector (d :: Nat) r.
Vector_ vector d r =>
[r] -> Maybe vector
vectorFromList = StateT [r] Maybe vector -> [r] -> Maybe vector
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT (StateT [r] Maybe vector -> [r] -> Maybe vector)
-> StateT [r] Maybe vector -> [r] -> Maybe vector
forall a b. (a -> b) -> a -> b
$ do v <- (Int -> StateT [r] Maybe r) -> StateT [r] Maybe vector
forall vector (d :: Nat) r (f :: * -> *).
(Vector_ vector d r, Applicative f) =>
(Int -> f r) -> f vector
forall (f :: * -> *). Applicative f => (Int -> f r) -> f vector
generateA Int -> StateT [r] Maybe r
forall r. Int -> StateT [r] Maybe r
next
rest <- get
guard (null rest)
pure v
where
next :: Int -> StateT [r] Maybe r
next :: forall r. Int -> StateT [r] Maybe r
next Int
_ = StateT [r] Maybe [r]
forall s (m :: * -> *). MonadState s m => m s
get StateT [r] Maybe [r]
-> ([r] -> StateT [r] Maybe r) -> StateT [r] Maybe r
forall a b.
StateT [r] Maybe a
-> (a -> StateT [r] Maybe b) -> StateT [r] Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
[] -> String -> StateT [r] Maybe r
forall a. String -> StateT [r] Maybe a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"vectorFromList: no next element"
r
x:[r]
xs -> do [r] -> StateT [r] Maybe ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put [r]
xs
r -> StateT [r] Maybe r
forall a. a -> StateT [r] Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure r
x
{-# INLINE vectorFromList #-}
component :: forall i vector r d.
(i <= d-1, KnownNat i, Vector_ vector d r)
=> IndexedLens' Int vector r
component :: forall (i :: Nat) vector r (d :: Nat).
(i <= (d - 1), KnownNat i, Vector_ vector d r) =>
IndexedLens' Int vector r
component = Traversing p f vector vector r r -> Over p f vector vector r r
forall (p :: * -> * -> *) (f :: * -> *) s t a.
(HasCallStack, Conjoined p, Functor f) =>
Traversing p f s t a a -> Over p f s t a a
singular (Traversing p f vector vector r r -> Over p f vector vector r r)
-> Traversing p f vector vector r r -> Over p f vector vector r r
forall a b. (a -> b) -> a -> b
$ Int -> IndexedTraversal' Int vector r
forall vector (d :: Nat) r.
Vector_ vector d r =>
Int -> IndexedTraversal' Int vector r
component' (Nat -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Nat -> Int) -> (Proxy i -> Nat) -> Proxy i -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy i -> Nat
forall (n :: Nat) (proxy :: Nat -> *). KnownNat n => proxy n -> Nat
natVal (Proxy i -> Int) -> Proxy i -> Int
forall a b. (a -> b) -> a -> b
$ forall (t :: Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @i)
{-# INLINE component #-}
xComponent :: (Vector_ vector d r, 0 <= d - 1)
=> IndexedLens' Int vector r
xComponent :: forall vector (d :: Nat) r.
(Vector_ vector d r, 0 <= (d - 1)) =>
IndexedLens' Int vector r
xComponent = forall (i :: Nat) vector r (d :: Nat).
(i <= (d - 1), KnownNat i, Vector_ vector d r) =>
IndexedLens' Int vector r
component @0
{-# INLINE xComponent #-}
yComponent :: (Vector_ vector d r, 1 <= d - 1)
=> IndexedLens' Int vector r
yComponent :: forall vector (d :: Nat) r.
(Vector_ vector d r, 1 <= (d - 1)) =>
IndexedLens' Int vector r
yComponent = forall (i :: Nat) vector r (d :: Nat).
(i <= (d - 1), KnownNat i, Vector_ vector d r) =>
IndexedLens' Int vector r
component @1
{-# INLINE yComponent #-}
zComponent :: (Vector_ vector d r, 2 <= d - 1)
=> IndexedLens' Int vector r
zComponent :: forall vector (d :: Nat) r.
(Vector_ vector d r, 2 <= (d - 1)) =>
IndexedLens' Int vector r
zComponent = forall (i :: Nat) vector r (d :: Nat).
(i <= (d - 1), KnownNat i, Vector_ vector d r) =>
IndexedLens' Int vector r
component @2
{-# INLINE zComponent #-}
wComponent :: (Vector_ vector d r, 3 <= d - 1)
=> IndexedLens' Int vector r
wComponent :: forall vector (d :: Nat) r.
(Vector_ vector d r, 3 <= (d - 1)) =>
IndexedLens' Int vector r
wComponent = forall (i :: Nat) vector r (d :: Nat).
(i <= (d - 1), KnownNat i, Vector_ vector d r) =>
IndexedLens' Int vector r
component @3
{-# INLINE wComponent #-}
prefix :: forall i d vector vector' r. ( i <= d
, Vector_ vector d r
, Vector_ vector' i r
)
=> vector -> vector'
prefix :: forall (i :: Nat) (d :: Nat) vector vector' r.
(i <= d, Vector_ vector d r, Vector_ vector' i r) =>
vector -> vector'
prefix vector
v = (Int -> r) -> vector'
forall vector (d :: Nat) r.
Vector_ vector d r =>
(Int -> r) -> vector
generate (\Int
i -> vector
vvector -> Getting (Endo r) vector r -> r
forall s a. HasCallStack => s -> Getting (Endo a) s a -> a
^?!Int -> IndexedTraversal' Int vector r
forall vector (d :: Nat) r.
Vector_ vector d r =>
Int -> IndexedTraversal' Int vector r
component' Int
i)
{-# INLINE prefix #-}
suffix :: forall i d vector vector' r. ( i <= d
, Vector_ vector d r
, Vector_ vector' i r
)
=> vector -> vector'
suffix :: forall (i :: Nat) (d :: Nat) vector vector' r.
(i <= d, Vector_ vector d r, Vector_ vector' i r) =>
vector -> vector'
suffix vector
v = let d :: Int
d = Nat -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Nat -> Int) -> (Proxy d -> Nat) -> Proxy d -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy d -> Nat
forall (n :: Nat) (proxy :: Nat -> *). KnownNat n => proxy n -> Nat
natVal (Proxy d -> Int) -> Proxy d -> Int
forall a b. (a -> b) -> a -> b
$ forall (t :: Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @d
s :: Int
s = Int
d Int -> Int -> Int
forall a. Num a => a -> a -> a
- (Nat -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Nat -> Int) -> (Proxy i -> Nat) -> Proxy i -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy i -> Nat
forall (n :: Nat) (proxy :: Nat -> *). KnownNat n => proxy n -> Nat
natVal (Proxy i -> Int) -> Proxy i -> Int
forall a b. (a -> b) -> a -> b
$ forall (t :: Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @i)
in (Int -> r) -> vector'
forall vector (d :: Nat) r.
Vector_ vector d r =>
(Int -> r) -> vector
generate (\Int
j -> vector
vvector -> Getting (Endo r) vector r -> r
forall s a. HasCallStack => s -> Getting (Endo a) s a -> a
^?!Int -> IndexedTraversal' Int vector r
forall vector (d :: Nat) r.
Vector_ vector d r =>
Int -> IndexedTraversal' Int vector r
component' (Int
sInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
j))
{-# INLINE suffix #-}
class Vector_ vector d r => Additive_ vector d r where
liftU2 :: (r -> r -> r) -> vector -> vector -> vector
liftI2A :: Apply.Apply f => (r -> r -> f r) -> vector -> vector -> f vector
infixl 6 ^+^, ^-^
infixl 7 ^*, *^, ^/
zero :: (Num r, Additive_ vector d r) => vector
zero :: forall r vector (d :: Nat). (Num r, Additive_ vector d r) => vector
zero = (Int -> r) -> vector
forall vector (d :: Nat) r.
Vector_ vector d r =>
(Int -> r) -> vector
generate (r -> Int -> r
forall a b. a -> b -> a
const r
0)
{-# INLINE zero #-}
(^+^) :: (Num r, Additive_ vector d r) => vector -> vector -> vector
vector
u ^+^ :: forall r vector (d :: Nat).
(Num r, Additive_ vector d r) =>
vector -> vector -> vector
^+^ vector
v = (r -> r -> r) -> vector -> vector -> vector
forall vector (d :: Nat) r.
Additive_ vector d r =>
(r -> r -> r) -> vector -> vector -> vector
liftU2 r -> r -> r
forall a. Num a => a -> a -> a
(+) vector
u vector
v
{-# INLINE (^+^) #-}
(^-^) :: (Num r, Additive_ vector d r) => vector -> vector -> vector
vector
u ^-^ :: forall r vector (d :: Nat).
(Num r, Additive_ vector d r) =>
vector -> vector -> vector
^-^ vector
v = vector
u vector -> vector -> vector
forall r vector (d :: Nat).
(Num r, Additive_ vector d r) =>
vector -> vector -> vector
^+^ vector -> vector
forall r vector (d :: Nat).
(Num r, Vector_ vector d r) =>
vector -> vector
negated vector
v
{-# INLINE (^-^) #-}
lerp :: (Num r, Additive_ vector d r) => r -> vector -> vector -> vector
lerp :: forall r vector (d :: Nat).
(Num r, Additive_ vector d r) =>
r -> vector -> vector -> vector
lerp r
alpha vector
u vector
v = r
alpha r -> vector -> vector
forall r vector (d :: Nat).
(Num r, Vector_ vector d r) =>
r -> vector -> vector
*^ vector
u vector -> vector -> vector
forall r vector (d :: Nat).
(Num r, Additive_ vector d r) =>
vector -> vector -> vector
^+^ (r
1r -> r -> r
forall a. Num a => a -> a -> a
-r
alpha) r -> vector -> vector
forall r vector (d :: Nat).
(Num r, Vector_ vector d r) =>
r -> vector -> vector
*^ vector
v
{-# INLINE lerp #-}
liftI2 :: Additive_ vector d r => (r -> r -> r) -> vector -> vector -> vector
liftI2 :: forall vector (d :: Nat) r.
Additive_ vector d r =>
(r -> r -> r) -> vector -> vector -> vector
liftI2 r -> r -> r
f vector
u vector
v = Identity vector -> vector
forall a. Identity a -> a
runIdentity (Identity vector -> vector) -> Identity vector -> vector
forall a b. (a -> b) -> a -> b
$ (r -> r -> Identity r) -> vector -> vector -> Identity vector
forall vector (d :: Nat) r (f :: * -> *).
(Additive_ vector d r, Apply f) =>
(r -> r -> f r) -> vector -> vector -> f vector
forall (f :: * -> *).
Apply f =>
(r -> r -> f r) -> vector -> vector -> f vector
liftI2A (\r
x r
x' -> r -> Identity r
forall a. a -> Identity a
Identity (r -> Identity r) -> r -> Identity r
forall a b. (a -> b) -> a -> b
$ r -> r -> r
f r
x r
x') vector
u vector
v
{-# INLINE liftI2 #-}
foldMapZip :: (Additive_ vector d r, Semigroup m)
=> (r -> r -> m) -> vector -> vector -> m
foldMapZip :: forall vector (d :: Nat) r m.
(Additive_ vector d r, Semigroup m) =>
(r -> r -> m) -> vector -> vector -> m
foldMapZip r -> r -> m
f vector
u vector
v = Const m vector -> m
forall {k} a (b :: k). Const a b -> a
getConst (Const m vector -> m) -> Const m vector -> m
forall a b. (a -> b) -> a -> b
$ (r -> r -> Const m r) -> vector -> vector -> Const m vector
forall vector (d :: Nat) r (f :: * -> *).
(Additive_ vector d r, Apply f) =>
(r -> r -> f r) -> vector -> vector -> f vector
forall (f :: * -> *).
Apply f =>
(r -> r -> f r) -> vector -> vector -> f vector
liftI2A (\r
x r
x' -> m -> Const m r
forall {k} a (b :: k). a -> Const a b
Const (m -> Const m r) -> m -> Const m r
forall a b. (a -> b) -> a -> b
$ r -> r -> m
f r
x r
x') vector
u vector
v
{-# INLINE foldMapZip #-}
unit :: forall vector d r. (Additive_ vector d r, Num r) => vector
unit :: forall vector (d :: Nat) r. (Additive_ vector d r, Num r) => vector
unit = ASetter vector vector r r -> (r -> r) -> vector -> vector
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over (forall vector vector'.
HasComponents vector vector' =>
IndexedTraversal1
Int vector vector' (IxValue vector) (IxValue vector')
components @vector @vector) (r -> r -> r
forall a b. a -> b -> a
const r
1) vector
forall r vector (d :: Nat). (Num r, Additive_ vector d r) => vector
zero
{-# INLINE unit #-}
negated :: (Num r, Vector_ vector d r) => vector -> vector
negated :: forall r vector (d :: Nat).
(Num r, Vector_ vector d r) =>
vector -> vector
negated = ((-r
1) r -> vector -> vector
forall r vector (d :: Nat).
(Num r, Vector_ vector d r) =>
r -> vector -> vector
*^)
{-# INLINABLE negated #-}
(*^) :: (Num r, Vector_ vector d r) => r -> vector -> vector
r
s *^ :: forall r vector (d :: Nat).
(Num r, Vector_ vector d r) =>
r -> vector -> vector
*^ vector
v = ASetter vector vector r r -> (r -> r) -> vector -> vector
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter vector vector r r
(IxValue vector -> Identity (IxValue vector))
-> vector -> Identity vector
forall vector vector'.
HasComponents vector vector' =>
IndexedTraversal1
Int vector vector' (IxValue vector) (IxValue vector')
IndexedTraversal1
Int vector vector (IxValue vector) (IxValue vector)
components (r
sr -> r -> r
forall a. Num a => a -> a -> a
*) vector
v
{-# INLINABLE (*^) #-}
(^*) :: (Num r, Vector_ vector d r) => vector -> r -> vector
vector
v ^* :: forall r vector (d :: Nat).
(Num r, Vector_ vector d r) =>
vector -> r -> vector
^* r
s = r
s r -> vector -> vector
forall r vector (d :: Nat).
(Num r, Vector_ vector d r) =>
r -> vector -> vector
*^ vector
v
{-# INLINABLE (^*) #-}
(^/) :: (Vector_ vector d r, Fractional r) => vector -> r -> vector
vector
v ^/ :: forall vector (d :: Nat) r.
(Vector_ vector d r, Fractional r) =>
vector -> r -> vector
^/ r
s = vector
v vector -> r -> vector
forall r vector (d :: Nat).
(Num r, Vector_ vector d r) =>
vector -> r -> vector
^* (r
1r -> r -> r
forall a. Fractional a => a -> a -> a
/r
s)
{-# INLINABLE (^/) #-}
sumV :: (Foldable f, Additive_ vector d r, Num r) => f vector -> vector
sumV :: forall (f :: * -> *) vector (d :: Nat) r.
(Foldable f, Additive_ vector d r, Num r) =>
f vector -> vector
sumV = (vector -> vector -> vector) -> vector -> f vector -> vector
forall b a. (b -> a -> b) -> b -> f a -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' vector -> vector -> vector
forall r vector (d :: Nat).
(Num r, Additive_ vector d r) =>
vector -> vector -> vector
(^+^) vector
forall r vector (d :: Nat). (Num r, Additive_ vector d r) => vector
zero
{-# INLINABLE sumV #-}
basis :: (Additive_ vector d r, Num r) => [vector]
basis :: forall vector (d :: Nat) r.
(Additive_ vector d r, Num r) =>
[vector]
basis = vector -> [vector]
forall vector (d :: Nat) r.
(Additive_ vector d r, Num r) =>
vector -> [vector]
basisFor vector
forall r vector (d :: Nat). (Num r, Additive_ vector d r) => vector
zero
{-# INLINABLE basis #-}
basisFor :: (Additive_ vector d r, Num r) => vector -> [vector]
basisFor :: forall vector (d :: Nat) r.
(Additive_ vector d r, Num r) =>
vector -> [vector]
basisFor vector
t =
IndexedGetting Int [vector] vector r
-> (Int -> r -> [vector]) -> vector -> [vector]
forall i m s a. IndexedGetting i m s a -> (i -> a -> m) -> s -> m
ifoldMapOf IndexedGetting Int [vector] vector r
Indexed Int (IxValue vector) (Const [vector] (IxValue vector))
-> vector -> Const [vector] vector
forall vector vector'.
HasComponents vector vector' =>
IndexedTraversal1
Int vector vector' (IxValue vector) (IxValue vector')
IndexedTraversal1
Int vector vector (IxValue vector) (IxValue vector)
components ((Int -> r -> [vector]) -> vector -> [vector])
-> vector -> (Int -> r -> [vector]) -> [vector]
forall (f :: * -> *) a b. Functor f => f (a -> b) -> a -> f b
?? vector
t ((Int -> r -> [vector]) -> [vector])
-> (Int -> r -> [vector]) -> [vector]
forall a b. (a -> b) -> a -> b
$ \Int
i r
_ ->
vector -> [vector]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (vector -> [vector]) -> vector -> [vector]
forall a b. (a -> b) -> a -> b
$
AnIndexedSetter Int vector vector r r
-> (Int -> r -> r) -> vector -> vector
forall i s t a b.
AnIndexedSetter i s t a b -> (i -> a -> b) -> s -> t
iover AnIndexedSetter Int vector vector r r
Indexed Int (IxValue vector) (Identity (IxValue vector))
-> vector -> Identity vector
forall vector vector'.
HasComponents vector vector' =>
IndexedTraversal1
Int vector vector' (IxValue vector) (IxValue vector')
IndexedTraversal1
Int vector vector (IxValue vector) (IxValue vector)
components ((Int -> r -> r) -> vector -> vector)
-> vector -> (Int -> r -> r) -> vector
forall (f :: * -> *) a b. Functor f => f (a -> b) -> a -> f b
?? vector
t ((Int -> r -> r) -> vector) -> (Int -> r -> r) -> vector
forall a b. (a -> b) -> a -> b
$ \Int
j r
_ ->
if Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
j then r
1 else r
0
{-# INLINABLE basisFor #-}
class Additive_ vector d r => Metric_ vector d r where
{-# MINIMAL #-}
dot :: Num r => vector -> vector -> r
dot vector
u vector
v = Getting (Endo (Endo r)) vector r -> vector -> r
forall a s. Num a => Getting (Endo (Endo a)) s a -> s -> a
sumOf Getting (Endo (Endo r)) vector r
(IxValue vector -> Const (Endo (Endo r)) (IxValue vector))
-> vector -> Const (Endo (Endo r)) vector
forall vector vector'.
HasComponents vector vector' =>
IndexedTraversal1
Int vector vector' (IxValue vector) (IxValue vector')
IndexedTraversal1
Int vector vector (IxValue vector) (IxValue vector)
components (vector -> r) -> vector -> r
forall a b. (a -> b) -> a -> b
$ (r -> r -> r) -> vector -> vector -> vector
forall vector (d :: Nat) r.
Additive_ vector d r =>
(r -> r -> r) -> vector -> vector -> vector
liftI2 r -> r -> r
forall a. Num a => a -> a -> a
(*) vector
u vector
v
{-# INLINE dot #-}
quadrance :: Num r => vector -> r
quadrance vector
v = vector -> vector -> r
forall vector (d :: Nat) r.
(Metric_ vector d r, Num r) =>
vector -> vector -> r
dot vector
v vector
v
{-# INLINE quadrance #-}
qd :: Num r => vector -> vector -> r
qd vector
u vector
v = vector -> r
forall vector (d :: Nat) r.
(Metric_ vector d r, Num r) =>
vector -> r
quadrance (vector -> r) -> vector -> r
forall a b. (a -> b) -> a -> b
$ vector
u vector -> vector -> vector
forall r vector (d :: Nat).
(Num r, Additive_ vector d r) =>
vector -> vector -> vector
^-^ vector
v
{-# INLINE qd #-}
norm :: Radical.Radical r => vector -> r
norm = r -> r
forall r. Radical r => r -> r
Radical.sqrt (r -> r) -> (vector -> r) -> vector -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. vector -> r
forall vector (d :: Nat) r.
(Metric_ vector d r, Num r) =>
vector -> r
quadrance
{-# INLINE norm #-}
signorm :: ( Radical.Radical r
, Fractional r
) => vector -> vector
signorm vector
v = vector
v vector -> r -> vector
forall vector (d :: Nat) r.
(Vector_ vector d r, Fractional r) =>
vector -> r -> vector
^/ vector -> r
forall vector (d :: Nat) r.
(Metric_ vector d r, Radical r) =>
vector -> r
norm vector
v
{-# INLINE signorm #-}
instance ( Additive_ (Vector d r) d r
, UniformRange r, Ord (Vector d r)
) => UniformRange (Vector d r) where
uniformRM :: forall g (m :: * -> *).
StatefulGen g m =>
(Vector d r, Vector d r) -> g -> m (Vector d r)
uniformRM (Vector d r
lows,Vector d r
highs) g
gen = WrappedApplicative m (Vector d r) -> m (Vector d r)
forall (f :: * -> *) a. WrappedApplicative f a -> f a
Apply.unwrapApplicative (WrappedApplicative m (Vector d r) -> m (Vector d r))
-> WrappedApplicative m (Vector d r) -> m (Vector d r)
forall a b. (a -> b) -> a -> b
$
(r -> r -> WrappedApplicative m r)
-> Vector d r -> Vector d r -> WrappedApplicative m (Vector d r)
forall vector (d :: Nat) r (f :: * -> *).
(Additive_ vector d r, Apply f) =>
(r -> r -> f r) -> vector -> vector -> f vector
forall (f :: * -> *).
Apply f =>
(r -> r -> f r) -> Vector d r -> Vector d r -> f (Vector d r)
liftI2A (\r
l r
h -> m r -> WrappedApplicative m r
forall (f :: * -> *) a. f a -> WrappedApplicative f a
Apply.WrapApplicative (m r -> WrappedApplicative m r) -> m r -> WrappedApplicative m r
forall a b. (a -> b) -> a -> b
$ (r, r) -> g -> m r
forall a g (m :: * -> *).
(UniformRange a, StatefulGen g m) =>
(a, a) -> g -> m a
forall g (m :: * -> *). StatefulGen g m => (r, r) -> g -> m r
uniformRM (r
l,r
h) g
gen) Vector d r
lows Vector d r
highs
isInRange :: (Vector d r, Vector d r) -> Vector d r -> Bool
isInRange = (Vector d r, Vector d r) -> Vector d r -> Bool
forall a. Ord a => (a, a) -> a -> Bool
isInRangeOrd
instance (Vector_ (Vector d r) d r, Uniform r) => Uniform (Vector d r) where
uniformM :: forall g (m :: * -> *). StatefulGen g m => g -> m (Vector d r)
uniformM g
gen = (Int -> m r) -> m (Vector d r)
forall vector (d :: Nat) r (f :: * -> *).
(Vector_ vector d r, Applicative f) =>
(Int -> f r) -> f vector
forall (f :: * -> *).
Applicative f =>
(Int -> f r) -> f (Vector d r)
generateA (m r -> Int -> m r
forall a b. a -> b -> a
const (m r -> Int -> m r) -> m r -> Int -> m r
forall a b. (a -> b) -> a -> b
$ g -> m r
forall a g (m :: * -> *). (Uniform a, StatefulGen g m) => g -> m a
forall g (m :: * -> *). StatefulGen g m => g -> m r
uniformM g
gen)
instance (Additive_ (Vector d r) d r, Uniform r, UniformRange r, Ord (Vector d r)
) => Random (Vector d r)
type instance Dimension (Linear.V1 r) = 1
instance AsVector_ (Linear.V1 r) (Linear.V1 s) 1 r s where
_Vector :: Iso (V1 r) (V1 s) (Vector 1 r) (Vector 1 s)
_Vector = p (Vector 1 r) (f (Vector 1 s)) -> p (V1 r) (f (V1 s))
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Iso (V1 r) (V1 s) (Vector 1 r) (Vector 1 s)
coerced
{-# INLINE _Vector #-}
instance Vector_ (Linear.V1 r) 1 r where
generateA :: forall (f :: * -> *). Applicative f => (Int -> f r) -> f (V1 r)
generateA Int -> f r
f = r -> V1 r
forall a. a -> V1 a
Linear.V1 (r -> V1 r) -> f r -> f (V1 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> f r
f Int
0
{-# INLINE generateA #-}
component' :: Int -> IndexedTraversal' Int (V1 r) r
component' Int
i p r (f r)
f v :: V1 r
v@(Linear.V1 r
x) = case Int
i of
Int
0 -> r -> V1 r
forall a. a -> V1 a
Linear.V1 (r -> V1 r) -> f r -> f (V1 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p r (f r) -> Int -> r -> f r
forall a b. p a b -> Int -> a -> b
forall i (p :: * -> * -> *) a b.
Indexable i p =>
p a b -> i -> a -> b
indexed p r (f r)
f Int
i r
x
Int
_ -> V1 r -> f (V1 r)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure V1 r
v
{-# INLINE component' #-}
instance Additive_ (Linear.V1 r) 1 r where
liftU2 :: (r -> r -> r) -> V1 r -> V1 r -> V1 r
liftU2 r -> r -> r
f (Linear.V1 r
x) (Linear.V1 r
x') = r -> V1 r
forall a. a -> V1 a
Linear.V1 (r -> V1 r) -> r -> V1 r
forall a b. (a -> b) -> a -> b
$ r -> r -> r
f r
x r
x'
{-# INLINE liftU2 #-}
liftI2A :: forall (f :: * -> *).
Apply f =>
(r -> r -> f r) -> V1 r -> V1 r -> f (V1 r)
liftI2A r -> r -> f r
f (Linear.V1 r
x) (Linear.V1 r
x') = r -> V1 r
forall a. a -> V1 a
Linear.V1 (r -> V1 r) -> f r -> f (V1 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> r -> r -> f r
f r
x r
x'
{-# INLINE liftI2A #-}
instance Metric_ (Linear.V1 r) 1 r
type instance Dimension (Linear.V2 r) = 2
instance AsVector_ (Linear.V2 r) (Linear.V2 s) 2 r s where
_Vector :: Iso (V2 r) (V2 s) (Vector 2 r) (Vector 2 s)
_Vector = p (Vector 2 r) (f (Vector 2 s)) -> p (V2 r) (f (V2 s))
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Iso (V2 r) (V2 s) (Vector 2 r) (Vector 2 s)
coerced
{-# INLINE _Vector #-}
instance Vector_ (Linear.V2 r) 2 r where
generateA :: forall (f :: * -> *). Applicative f => (Int -> f r) -> f (V2 r)
generateA Int -> f r
f = r -> r -> V2 r
forall a. a -> a -> V2 a
Linear.V2 (r -> r -> V2 r) -> f r -> f (r -> V2 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> f r
f Int
0 f (r -> V2 r) -> f r -> f (V2 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> f r
f Int
1
{-# INLINE generateA #-}
component' :: Int -> IndexedTraversal' Int (V2 r) r
component' Int
i p r (f r)
f v :: V2 r
v@(Linear.V2 r
x r
y) = case Int
i of
Int
0 -> (r -> r -> V2 r) -> r -> r -> V2 r
forall a b c. (a -> b -> c) -> b -> a -> c
flip r -> r -> V2 r
forall a. a -> a -> V2 a
Linear.V2 r
y (r -> V2 r) -> f r -> f (V2 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p r (f r) -> Int -> r -> f r
forall a b. p a b -> Int -> a -> b
forall i (p :: * -> * -> *) a b.
Indexable i p =>
p a b -> i -> a -> b
indexed p r (f r)
f Int
i r
x
Int
1 -> r -> r -> V2 r
forall a. a -> a -> V2 a
Linear.V2 r
x (r -> V2 r) -> f r -> f (V2 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p r (f r) -> Int -> r -> f r
forall a b. p a b -> Int -> a -> b
forall i (p :: * -> * -> *) a b.
Indexable i p =>
p a b -> i -> a -> b
indexed p r (f r)
f Int
i r
y
Int
_ -> V2 r -> f (V2 r)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure V2 r
v
{-# INLINE component' #-}
instance Additive_ (Linear.V2 r) 2 r where
liftU2 :: (r -> r -> r) -> V2 r -> V2 r -> V2 r
liftU2 r -> r -> r
f (Linear.V2 r
x r
y) (Linear.V2 r
x' r
y') = r -> r -> V2 r
forall a. a -> a -> V2 a
Linear.V2 (r -> r -> r
f r
x r
x') (r -> r -> r
f r
y r
y')
{-# INLINE liftU2 #-}
liftI2A :: forall (f :: * -> *).
Apply f =>
(r -> r -> f r) -> V2 r -> V2 r -> f (V2 r)
liftI2A r -> r -> f r
f (Linear.V2 r
x r
y) (Linear.V2 r
x' r
y') = r -> r -> V2 r
forall a. a -> a -> V2 a
Linear.V2 (r -> r -> V2 r) -> f r -> f (r -> V2 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> r -> r -> f r
f r
x r
x' f (r -> V2 r) -> f r -> f (V2 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
Apply.<.> r -> r -> f r
f r
y r
y'
{-# INLINE liftI2A #-}
instance Metric_ (Linear.V2 r) 2 r
type instance Dimension (Linear.V3 r) = 3
instance AsVector_ (Linear.V3 r) (Linear.V3 s) 3 r s where
_Vector :: Iso (V3 r) (V3 s) (Vector 3 r) (Vector 3 s)
_Vector = p (Vector 3 r) (f (Vector 3 s)) -> p (V3 r) (f (V3 s))
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Iso (V3 r) (V3 s) (Vector 3 r) (Vector 3 s)
coerced
{-# INLINE _Vector #-}
instance Vector_ (Linear.V3 r) 3 r where
generateA :: forall (f :: * -> *). Applicative f => (Int -> f r) -> f (V3 r)
generateA Int -> f r
f = r -> r -> r -> V3 r
forall a. a -> a -> a -> V3 a
Linear.V3 (r -> r -> r -> V3 r) -> f r -> f (r -> r -> V3 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> f r
f Int
0 f (r -> r -> V3 r) -> f r -> f (r -> V3 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> f r
f Int
1 f (r -> V3 r) -> f r -> f (V3 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> f r
f Int
2
{-# INLINE generateA #-}
component' :: Int -> IndexedTraversal' Int (V3 r) r
component' Int
i p r (f r)
f v :: V3 r
v@(Linear.V3 r
x r
y r
z) = case Int
i of
Int
0 -> (\r
x' -> r -> r -> r -> V3 r
forall a. a -> a -> a -> V3 a
Linear.V3 r
x' r
y r
z) (r -> V3 r) -> f r -> f (V3 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p r (f r) -> Int -> r -> f r
forall a b. p a b -> Int -> a -> b
forall i (p :: * -> * -> *) a b.
Indexable i p =>
p a b -> i -> a -> b
indexed p r (f r)
f Int
i r
x
Int
1 -> (\r
y' -> r -> r -> r -> V3 r
forall a. a -> a -> a -> V3 a
Linear.V3 r
x r
y' r
z) (r -> V3 r) -> f r -> f (V3 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p r (f r) -> Int -> r -> f r
forall a b. p a b -> Int -> a -> b
forall i (p :: * -> * -> *) a b.
Indexable i p =>
p a b -> i -> a -> b
indexed p r (f r)
f Int
i r
y
Int
2 -> (\r
z' -> r -> r -> r -> V3 r
forall a. a -> a -> a -> V3 a
Linear.V3 r
x r
y r
z') (r -> V3 r) -> f r -> f (V3 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p r (f r) -> Int -> r -> f r
forall a b. p a b -> Int -> a -> b
forall i (p :: * -> * -> *) a b.
Indexable i p =>
p a b -> i -> a -> b
indexed p r (f r)
f Int
i r
z
Int
_ -> V3 r -> f (V3 r)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure V3 r
v
{-# INLINE component' #-}
instance Additive_ (Linear.V3 r) 3 r where
liftU2 :: (r -> r -> r) -> V3 r -> V3 r -> V3 r
liftU2 r -> r -> r
f (Linear.V3 r
x r
y r
z) (Linear.V3 r
x' r
y' r
z') = r -> r -> r -> V3 r
forall a. a -> a -> a -> V3 a
Linear.V3 (r -> r -> r
f r
x r
x') (r -> r -> r
f r
y r
y') (r -> r -> r
f r
z r
z')
{-# INLINE liftU2 #-}
liftI2A :: forall (f :: * -> *).
Apply f =>
(r -> r -> f r) -> V3 r -> V3 r -> f (V3 r)
liftI2A r -> r -> f r
f (Linear.V3 r
x r
y r
z) (Linear.V3 r
x' r
y' r
z') =
r -> r -> r -> V3 r
forall a. a -> a -> a -> V3 a
Linear.V3 (r -> r -> r -> V3 r) -> f r -> f (r -> r -> V3 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> r -> r -> f r
f r
x r
x' f (r -> r -> V3 r) -> f r -> f (r -> V3 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
Apply.<.> r -> r -> f r
f r
y r
y' f (r -> V3 r) -> f r -> f (V3 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
Apply.<.> r -> r -> f r
f r
z r
z'
{-# INLINE liftI2A #-}
instance Metric_ (Linear.V3 r) 3 r
type instance Dimension (Linear.V4 r) = 4
instance AsVector_ (Linear.V4 r) (Linear.V4 s) 4 r s where
_Vector :: Iso (V4 r) (V4 s) (Vector 4 r) (Vector 4 s)
_Vector = p (Vector 4 r) (f (Vector 4 s)) -> p (V4 r) (f (V4 s))
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Iso (V4 r) (V4 s) (Vector 4 r) (Vector 4 s)
coerced
{-# INLINE _Vector #-}
instance Vector_ (Linear.V4 r) 4 r where
generateA :: forall (f :: * -> *). Applicative f => (Int -> f r) -> f (V4 r)
generateA Int -> f r
f = r -> r -> r -> r -> V4 r
forall a. a -> a -> a -> a -> V4 a
Linear.V4 (r -> r -> r -> r -> V4 r) -> f r -> f (r -> r -> r -> V4 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> f r
f Int
0 f (r -> r -> r -> V4 r) -> f r -> f (r -> r -> V4 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> f r
f Int
1 f (r -> r -> V4 r) -> f r -> f (r -> V4 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> f r
f Int
2 f (r -> V4 r) -> f r -> f (V4 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> f r
f Int
3
{-# INLINE generateA #-}
component' :: Int -> IndexedTraversal' Int (V4 r) r
component' Int
i p r (f r)
f v :: V4 r
v@(Linear.V4 r
x r
y r
z r
w) = case Int
i of
Int
0 -> (\r
x' -> r -> r -> r -> r -> V4 r
forall a. a -> a -> a -> a -> V4 a
Linear.V4 r
x' r
y r
z r
w) (r -> V4 r) -> f r -> f (V4 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p r (f r) -> Int -> r -> f r
forall a b. p a b -> Int -> a -> b
forall i (p :: * -> * -> *) a b.
Indexable i p =>
p a b -> i -> a -> b
indexed p r (f r)
f Int
i r
x
Int
1 -> (\r
y' -> r -> r -> r -> r -> V4 r
forall a. a -> a -> a -> a -> V4 a
Linear.V4 r
x r
y' r
z r
w) (r -> V4 r) -> f r -> f (V4 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p r (f r) -> Int -> r -> f r
forall a b. p a b -> Int -> a -> b
forall i (p :: * -> * -> *) a b.
Indexable i p =>
p a b -> i -> a -> b
indexed p r (f r)
f Int
i r
y
Int
2 -> (\r
z' -> r -> r -> r -> r -> V4 r
forall a. a -> a -> a -> a -> V4 a
Linear.V4 r
x r
y r
z' r
w) (r -> V4 r) -> f r -> f (V4 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p r (f r) -> Int -> r -> f r
forall a b. p a b -> Int -> a -> b
forall i (p :: * -> * -> *) a b.
Indexable i p =>
p a b -> i -> a -> b
indexed p r (f r)
f Int
i r
z
Int
3 -> (\r
w' -> r -> r -> r -> r -> V4 r
forall a. a -> a -> a -> a -> V4 a
Linear.V4 r
x r
y r
z r
w') (r -> V4 r) -> f r -> f (V4 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p r (f r) -> Int -> r -> f r
forall a b. p a b -> Int -> a -> b
forall i (p :: * -> * -> *) a b.
Indexable i p =>
p a b -> i -> a -> b
indexed p r (f r)
f Int
i r
w
Int
_ -> V4 r -> f (V4 r)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure V4 r
v
{-# INLINE component' #-}
instance Additive_ (Linear.V4 r) 4 r where
liftU2 :: (r -> r -> r) -> V4 r -> V4 r -> V4 r
liftU2 r -> r -> r
f (Linear.V4 r
x r
y r
z r
w) (Linear.V4 r
x' r
y' r
z' r
w') =
r -> r -> r -> r -> V4 r
forall a. a -> a -> a -> a -> V4 a
Linear.V4 (r -> r -> r
f r
x r
x') (r -> r -> r
f r
y r
y') (r -> r -> r
f r
z r
z') (r -> r -> r
f r
w r
w')
{-# INLINE liftU2 #-}
liftI2A :: forall (f :: * -> *).
Apply f =>
(r -> r -> f r) -> V4 r -> V4 r -> f (V4 r)
liftI2A r -> r -> f r
f (Linear.V4 r
x r
y r
z r
w) (Linear.V4 r
x' r
y' r
z' r
w') =
r -> r -> r -> r -> V4 r
forall a. a -> a -> a -> a -> V4 a
Linear.V4 (r -> r -> r -> r -> V4 r) -> f r -> f (r -> r -> r -> V4 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> r -> r -> f r
f r
x r
x' f (r -> r -> r -> V4 r) -> f r -> f (r -> r -> V4 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
Apply.<.> r -> r -> f r
f r
y r
y' f (r -> r -> V4 r) -> f r -> f (r -> V4 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
Apply.<.> r -> r -> f r
f r
z r
z' f (r -> V4 r) -> f r -> f (V4 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
Apply.<.> r -> r -> f r
f r
w r
w'
{-# INLINE liftI2A #-}
instance Metric_ (Linear.V4 r) 4 r
instance Vector_ (Vector 1 r) 1 r where
generateA :: forall (f :: * -> *).
Applicative f =>
(Int -> f r) -> f (Vector 1 r)
generateA Int -> f r
f = r -> Vector 1 r
forall r. r -> Vector 1 r
Vector1 (r -> Vector 1 r) -> f r -> f (Vector 1 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> f r
f Int
0
{-# INLINE generateA #-}
instance Vector_ (Vector 2 r) 2 r where
generateA :: forall (f :: * -> *).
Applicative f =>
(Int -> f r) -> f (Vector 2 r)
generateA Int -> f r
f = r -> r -> Vector 2 r
forall r. r -> r -> Vector 2 r
Vector2 (r -> r -> Vector 2 r) -> f r -> f (r -> Vector 2 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> f r
f Int
0 f (r -> Vector 2 r) -> f r -> f (Vector 2 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> f r
f Int
1
{-# INLINE generateA #-}
instance Vector_ (Vector 3 r) 3 r where
generateA :: forall (f :: * -> *).
Applicative f =>
(Int -> f r) -> f (Vector 3 r)
generateA Int -> f r
f = r -> r -> r -> Vector 3 r
forall r. r -> r -> r -> Vector 3 r
Vector3 (r -> r -> r -> Vector 3 r) -> f r -> f (r -> r -> Vector 3 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> f r
f Int
0 f (r -> r -> Vector 3 r) -> f r -> f (r -> Vector 3 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> f r
f Int
1 f (r -> Vector 3 r) -> f r -> f (Vector 3 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> f r
f Int
2
{-# INLINE generateA #-}
instance Vector_ (Vector 4 r) 4 r where
generateA :: forall (f :: * -> *).
Applicative f =>
(Int -> f r) -> f (Vector 4 r)
generateA Int -> f r
f = r -> r -> r -> r -> Vector 4 r
forall r. r -> r -> r -> r -> Vector 4 r
Vector4 (r -> r -> r -> r -> Vector 4 r)
-> f r -> f (r -> r -> r -> Vector 4 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> f r
f Int
0 f (r -> r -> r -> Vector 4 r) -> f r -> f (r -> r -> Vector 4 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> f r
f Int
1 f (r -> r -> Vector 4 r) -> f r -> f (r -> Vector 4 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> f r
f Int
2 f (r -> Vector 4 r) -> f r -> f (Vector 4 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> f r
f Int
3
{-# INLINE generateA #-}
instance Additive_ (Vector 1 r) 1 r where
liftU2 :: (r -> r -> r) -> Vector 1 r -> Vector 1 r -> Vector 1 r
liftU2 r -> r -> r
f (Vector1 r
x) (Vector1 r
x') = r -> Vector 1 r
forall r. r -> Vector 1 r
Vector1 (r -> Vector 1 r) -> r -> Vector 1 r
forall a b. (a -> b) -> a -> b
$ r -> r -> r
f r
x r
x'
{-# INLINE liftU2 #-}
liftI2A :: forall (f :: * -> *).
Apply f =>
(r -> r -> f r) -> Vector 1 r -> Vector 1 r -> f (Vector 1 r)
liftI2A r -> r -> f r
f (Vector1 r
x) (Vector1 r
x') = r -> Vector 1 r
forall r. r -> Vector 1 r
Vector1 (r -> Vector 1 r) -> f r -> f (Vector 1 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> r -> r -> f r
f r
x r
x'
{-# INLINE liftI2A #-}
instance Additive_ (Vector 2 r) 2 r where
liftU2 :: (r -> r -> r) -> Vector 2 r -> Vector 2 r -> Vector 2 r
liftU2 r -> r -> r
f (Vector2 r
x r
y) (Vector2 r
x' r
y') = r -> r -> Vector 2 r
forall r. r -> r -> Vector 2 r
Vector2 (r -> r -> r
f r
x r
x') (r -> r -> r
f r
y r
y')
{-# INLINE liftU2 #-}
liftI2A :: forall (f :: * -> *).
Apply f =>
(r -> r -> f r) -> Vector 2 r -> Vector 2 r -> f (Vector 2 r)
liftI2A r -> r -> f r
f (Vector2 r
x r
y) (Vector2 r
x' r
y') = r -> r -> Vector 2 r
forall r. r -> r -> Vector 2 r
Vector2 (r -> r -> Vector 2 r) -> f r -> f (r -> Vector 2 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> r -> r -> f r
f r
x r
x' f (r -> Vector 2 r) -> f r -> f (Vector 2 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
Apply.<.> r -> r -> f r
f r
y r
y'
{-# INLINE liftI2A #-}
instance Additive_ (Vector 3 r) 3 r where
liftU2 :: (r -> r -> r) -> Vector 3 r -> Vector 3 r -> Vector 3 r
liftU2 r -> r -> r
f (Vector3 r
x r
y r
z) (Vector3 r
x' r
y' r
z') = r -> r -> r -> Vector 3 r
forall r. r -> r -> r -> Vector 3 r
Vector3 (r -> r -> r
f r
x r
x') (r -> r -> r
f r
y r
y') (r -> r -> r
f r
z r
z')
{-# INLINE liftU2 #-}
liftI2A :: forall (f :: * -> *).
Apply f =>
(r -> r -> f r) -> Vector 3 r -> Vector 3 r -> f (Vector 3 r)
liftI2A r -> r -> f r
f (Vector3 r
x r
y r
z) (Vector3 r
x' r
y' r
z') =
r -> r -> r -> Vector 3 r
forall r. r -> r -> r -> Vector 3 r
Vector3 (r -> r -> r -> Vector 3 r) -> f r -> f (r -> r -> Vector 3 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> r -> r -> f r
f r
x r
x' f (r -> r -> Vector 3 r) -> f r -> f (r -> Vector 3 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
Apply.<.> r -> r -> f r
f r
y r
y' f (r -> Vector 3 r) -> f r -> f (Vector 3 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
Apply.<.> r -> r -> f r
f r
z r
z'
{-# INLINE liftI2A #-}
instance Additive_ (Vector 4 r) 4 r where
liftU2 :: (r -> r -> r) -> Vector 4 r -> Vector 4 r -> Vector 4 r
liftU2 r -> r -> r
f (Vector4 r
x r
y r
z r
w) (Vector4 r
x' r
y' r
z' r
w') =
r -> r -> r -> r -> Vector 4 r
forall r. r -> r -> r -> r -> Vector 4 r
Vector4 (r -> r -> r
f r
x r
x') (r -> r -> r
f r
y r
y') (r -> r -> r
f r
z r
z') (r -> r -> r
f r
w r
w')
{-# INLINE liftU2 #-}
liftI2A :: forall (f :: * -> *).
Apply f =>
(r -> r -> f r) -> Vector 4 r -> Vector 4 r -> f (Vector 4 r)
liftI2A r -> r -> f r
f (Vector4 r
x r
y r
z r
w) (Vector4 r
x' r
y' r
z' r
w') =
r -> r -> r -> r -> Vector 4 r
forall r. r -> r -> r -> r -> Vector 4 r
Vector4 (r -> r -> r -> r -> Vector 4 r)
-> f r -> f (r -> r -> r -> Vector 4 r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> r -> r -> f r
f r
x r
x' f (r -> r -> r -> Vector 4 r) -> f r -> f (r -> r -> Vector 4 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
Apply.<.> r -> r -> f r
f r
y r
y' f (r -> r -> Vector 4 r) -> f r -> f (r -> Vector 4 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
Apply.<.> r -> r -> f r
f r
z r
z' f (r -> Vector 4 r) -> f r -> f (Vector 4 r)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Apply f => f (a -> b) -> f a -> f b
Apply.<.> r -> r -> f r
f r
w r
w'
{-# INLINE liftI2A #-}
instance Metric_ (Vector 1 r) 1 r
instance Metric_ (Vector 2 r) 2 r
instance Metric_ (Vector 3 r) 3 r
instance Metric_ (Vector 4 r) 4 r
instance ( Vector_ (Vector d r) d r
, Read r
, KnownNat d
) => Read (Vector d r) where
readPrec :: ReadPrec (Vector d r)
readPrec = ReadPrec (Vector d r) -> ReadPrec (Vector d r)
forall a. ReadPrec a -> ReadPrec a
readData (ReadPrec (Vector d r) -> ReadPrec (Vector d r))
-> ReadPrec (Vector d r) -> ReadPrec (Vector d r)
forall a b. (a -> b) -> a -> b
$
ReadPrec [r]
-> String -> ([r] -> Vector d r) -> ReadPrec (Vector d r)
forall a t. ReadPrec a -> String -> (a -> t) -> ReadPrec t
readUnaryWith (Int -> ReadPrec r -> ReadPrec [r]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
d ReadPrec r
forall a. Read a => ReadPrec a
readPrec) String
constr (([r] -> Vector d r) -> ReadPrec (Vector d r))
-> ([r] -> Vector d r) -> ReadPrec (Vector d r)
forall a b. (a -> b) -> a -> b
$ \[r]
rs ->
case [r] -> Maybe (Vector d r)
forall vector (d :: Nat) r.
Vector_ vector d r =>
[r] -> Maybe vector
vectorFromList [r]
rs of
Just Vector d r
p -> Vector d r
p
Maybe (Vector d r)
_ -> String -> Vector d r
forall a. HasCallStack => String -> a
error String
"internal error in HGeometry.Vector read instance."
where
d :: Int
d = Nat -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall (n :: Nat) (proxy :: Nat -> *). KnownNat n => proxy n -> Nat
natVal @d Proxy d
forall {k} (t :: k). Proxy t
Proxy)
constr :: String
constr = String
"Vector" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
d
cons :: forall vector' vector d r.
(Vector_ vector d r, Vector_ vector' (d+1) r)
=> r -> vector -> vector'
cons :: forall vector' vector (d :: Nat) r.
(Vector_ vector d r, Vector_ vector' (d + 1) r) =>
r -> vector -> vector'
cons r
x vector
v = (Int -> r) -> vector'
forall vector (d :: Nat) r.
Vector_ vector d r =>
(Int -> r) -> vector
generate ((Int -> r) -> vector') -> (Int -> r) -> vector'
forall a b. (a -> b) -> a -> b
$ \case
Int
0 -> r
x
Int
i -> vector
vvector -> Getting (Endo r) vector r -> r
forall s a. HasCallStack => s -> Getting (Endo a) s a -> a
^?!Int -> IndexedTraversal' Int vector r
forall vector (d :: Nat) r.
Vector_ vector d r =>
Int -> IndexedTraversal' Int vector r
component' (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)
{-# INLINE cons #-}
snoc :: forall vector' vector d r.
( Vector_ vector d r, Vector_ vector' (d+1) r)
=> vector -> r -> vector'
snoc :: forall vector' vector (d :: Nat) r.
(Vector_ vector d r, Vector_ vector' (d + 1) r) =>
vector -> r -> vector'
snoc vector
v r
x = let d :: Int
d = Nat -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Nat -> Int) -> (Proxy d -> Nat) -> Proxy d -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy d -> Nat
forall (n :: Nat) (proxy :: Nat -> *). KnownNat n => proxy n -> Nat
natVal (Proxy d -> Int) -> Proxy d -> Int
forall a b. (a -> b) -> a -> b
$ forall (t :: Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @d
in (Int -> r) -> vector'
forall vector (d :: Nat) r.
Vector_ vector d r =>
(Int -> r) -> vector
generate ((Int -> r) -> vector') -> (Int -> r) -> vector'
forall a b. (a -> b) -> a -> b
$ \Int
i -> if Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
d then r
x else vector
vvector -> Getting (Endo r) vector r -> r
forall s a. HasCallStack => s -> Getting (Endo a) s a -> a
^?!Int -> IndexedTraversal' Int vector r
forall vector (d :: Nat) r.
Vector_ vector d r =>
Int -> IndexedTraversal' Int vector r
component' Int
i
{-# INLINE snoc #-}
uncons :: forall vector' vector d r.
( Vector_ vector (d+1) r, Vector_ vector' d r
, 0 <= (d+1)-1, d <= Dimension vector
) => vector -> (r, vector')
uncons :: forall vector' vector (d :: Nat) r.
(Vector_ vector (d + 1) r, Vector_ vector' d r, 0 <= ((d + 1) - 1),
d <= Dimension vector) =>
vector -> (r, vector')
uncons vector
v = ( vector
vvector -> Getting r vector r -> r
forall s a. s -> Getting a s a -> a
^.forall (i :: Nat) vector r (d :: Nat).
(i <= (d - 1), KnownNat i, Vector_ vector d r) =>
IndexedLens' Int vector r
component @0, vector -> vector'
forall (i :: Nat) (d :: Nat) vector vector' r.
(i <= d, Vector_ vector d r, Vector_ vector' i r) =>
vector -> vector'
suffix vector
v)
{-# INLINE uncons #-}
unsnoc :: forall vector' vector d r.
(Vector_ vector (d+1) r, Vector_ vector' d r
, d <= d+1-1, d <= Dimension vector
) => vector -> (vector',r)
unsnoc :: forall vector' vector (d :: Nat) r.
(Vector_ vector (d + 1) r, Vector_ vector' d r, d <= ((d + 1) - 1),
d <= Dimension vector) =>
vector -> (vector', r)
unsnoc vector
v = ( vector -> vector'
forall (i :: Nat) (d :: Nat) vector vector' r.
(i <= d, Vector_ vector d r, Vector_ vector' i r) =>
vector -> vector'
prefix vector
v, vector
vvector -> Getting r vector r -> r
forall s a. s -> Getting a s a -> a
^.forall (i :: Nat) vector r (d :: Nat).
(i <= (d - 1), KnownNat i, Vector_ vector d r) =>
IndexedLens' Int vector r
component @d )
{-# INLINE unsnoc #-}