{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE InstanceSigs #-}


module Hylogen.Types.Vec where

import GHC.TypeLits
import Data.VectorSpace

import Hylogen.Expr


-- | Floating vector singleton type tag
data FloatVec (n :: Nat) where
  FloatVec :: (Veccable n) => FloatVec n

-- | Hylogen floating-point Vector type
type Vec n = Expr (FloatVec n)
type Vec1 = Vec 1
type Vec2 = Vec 2
type Vec3 = Vec 3
type Vec4 = Vec 4

instance ToGLSLType (FloatVec 1) where
  toGLSLType _ = GLSLFloat
  tag = FloatVec
instance ToGLSLType (FloatVec 2) where
  toGLSLType _ = GLSLVec2
  tag = FloatVec
instance ToGLSLType (FloatVec 3) where
  toGLSLType _ = GLSLVec3
  tag = FloatVec
instance ToGLSLType (FloatVec 4) where
  toGLSLType _ = GLSLVec4
  tag = FloatVec



-- | A Nat is veccable if it can be the dimension of a GLSL vector
class (ToGLSLType (FloatVec n), KnownNat n) => Veccable n where
  -- | Creates a Vec n from a Vec1
  copy :: Vec1 -> Vec n
  -- | Transforms a Vec n into a list of Vec1's
  toList :: Vec n -> [Vec1]


instance Veccable 1 where
  copy = id
  toList v = [v]
instance Veccable 2 where
  copy v = op2pre' "vec2" v v 
  toList v = [x_ v, y_ v]
instance Veccable 3 where
  copy v = op3pre' "vec3" v v v
  toList v = [x_ v, y_ v, z_ v]
instance Veccable 4 where
  copy v = op4pre' "vec4" v v v v
  toList v = [x_ v, y_ v, z_ v]



instance (Veccable n) => Num (Vec n) where
  (+) = op2' "+"
  (-) = op2' "-"
  (*) = op2' "*"
  abs = op1pre "abs"
  signum = op1pre "sign"
  negate = op1 "-"
  fromInteger x = copy . uniform . show $ (fromInteger x :: Float)


instance (Veccable n) => Fractional (Vec n) where
  (/) = op2' "/"
  fromRational x = copy . uniform . show $ (fromRational x :: Float)

instance (Veccable n) => Floating (Vec n) where
  -- pi = copy $ uniform "pi"
  pi = copy $ uniform "3.141592653589793238462643383"
  exp = op1pre "exp"
  log = op1pre "log"
  sqrt = op1pre "sqrt"
  (**) = op2pre' "pow"
  sin = op1pre "sin"
  cos = op1pre "cos"
  tan = op1pre "tan"
  asin = op1pre "asin"
  acos = op1pre "acos"
  atan = op1pre "atan"
  sinh x = (exp x - exp (negate x)) / 2
  cosh x = (exp x + exp (negate x))/2
  tanh x = sinh x / cosh x
  asinh x = log $ x + sqrt(x**2 + 1)
  acosh x = log $ x + sqrt(x**2 - 1)
  atanh x = 0.5 * log ((1 + x)/(1 - x))

instance Veccable n => AdditiveGroup (Vec n) where
  zeroV = 0
  (^+^) = (+)
  negateV = negate
  (^-^) = (-)

instance Veccable n => VectorSpace (Vec n) where
  type Scalar (Vec n) = Vec 1
  a *^ b = copy a * b

instance Veccable n => InnerSpace (Vec n) where
  a <.> b = Expr fv (Tree (Op2Pre, GLSLFloat, "dot") (fmap toMono [a, b]))
    where fv = FloatVec :: FloatVec 1


  


-- | Exposed constructor for making vec2's
vec2 :: (Vec1, Vec1) -> Vec2
vec2 (x, y) = op2pre' "vec2" x y


class ToVec3 tuple where
  -- | Exposed constructor for making vec3's
  vec3 :: tuple -> Vec3

instance (a ~ Vec m, b ~ Vec (3 - m)) => ToVec3 (a, b) where
  vec3 (x, y) = Expr fv (Tree (Op2Pre, toGLSLType fv, "vec3") [toMono x, toMono y])
      where fv = FloatVec :: FloatVec 3

instance (a ~ Vec1, b ~ Vec1, c ~ Vec1) => ToVec3 (a, b, c) where
  vec3 (x, y, z) = Expr fv (Tree (Op3Pre, toGLSLType fv, "vec3") (fmap toMono [x, y, z]))
      where fv = FloatVec :: FloatVec 3


class ToVec4 tuple where
  -- | Exposed constructor for making vec4's
  vec4 :: tuple -> Vec4

instance (a ~ Vec m, b ~ Vec (4 - m)) => ToVec4 (a, b) where
  vec4 (x, y) = Expr fv (Tree (Op2Pre, toGLSLType fv, "vec4") [toMono x,toMono y])
      where fv = FloatVec :: FloatVec 4

instance {-#INCOHERENT#-} (b ~ Vec1, c ~ Vec1) => ToVec4 (Vec2, b, c) where
  vec4 (x, y, z) = Expr fv (Tree (Op3Pre, toGLSLType fv, "vec4") [toMono x,toMono y,toMono z])
      where fv = FloatVec :: FloatVec 4

instance {-#INCOHERENT#-} (a ~ Vec1, c ~ Vec1) => ToVec4 (a, Vec2, c) where
  vec4 (x, y, z) = Expr fv (Tree (Op3Pre, toGLSLType fv, "vec4") [toMono x,toMono y,toMono z])
      where fv = FloatVec :: FloatVec 4

instance {-#INCOHERENT#-} (a ~ Vec1, b ~ Vec1) => ToVec4 (a, b, Vec2) where
  vec4 (x, y, z) = Expr fv (Tree (Op3Pre, toGLSLType fv, "vec4") [toMono x,toMono y,toMono z])
      where fv = FloatVec :: FloatVec 4


instance (a ~ Vec1, b ~ Vec1, c ~ Vec1, d ~ Vec1) => ToVec4 (a, b, c, d) where
  vec4 (x, y, z, w) = Expr fv (Tree (Op4Pre, toGLSLType fv, "vec4") (fmap toMono [x, y, z, w]))
      where fv = FloatVec :: FloatVec 4


type (>=) x y = (x + 1 <=? y) ~ 'False

-- | Makes swizzle functions. Uses GenSwizz.hs to generate the following 340 swizzle expressions.
mkSwizz :: forall n m. (Veccable n, Veccable m) => String -> Vec n -> Vec m
mkSwizz str v = Expr fv (Tree (Access, toGLSLType fv, str) [toMono v])
  where
    fv = FloatVec :: FloatVec m

xxxx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
xxxx_ = mkSwizz "xxxx"

yxxx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
yxxx_ = mkSwizz "yxxx"

zxxx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zxxx_ = mkSwizz "zxxx"

wxxx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxxx_ = mkSwizz "wxxx"

xxx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 3
xxx_ = mkSwizz "xxx"

xyxx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
xyxx_ = mkSwizz "xyxx"

yyxx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
yyxx_ = mkSwizz "yyxx"

zyxx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zyxx_ = mkSwizz "zyxx"

wyxx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wyxx_ = mkSwizz "wyxx"

yxx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 3
yxx_ = mkSwizz "yxx"

xzxx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xzxx_ = mkSwizz "xzxx"

yzxx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yzxx_ = mkSwizz "yzxx"

zzxx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zzxx_ = mkSwizz "zzxx"

wzxx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzxx_ = mkSwizz "wzxx"

zxx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
zxx_ = mkSwizz "zxx"

xwxx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwxx_ = mkSwizz "xwxx"

ywxx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywxx_ = mkSwizz "ywxx"

zwxx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwxx_ = mkSwizz "zwxx"

wwxx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwxx_ = mkSwizz "wwxx"

wxx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wxx_ = mkSwizz "wxx"

xx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 2
xx_ = mkSwizz "xx"

xxyx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
xxyx_ = mkSwizz "xxyx"

yxyx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
yxyx_ = mkSwizz "yxyx"

zxyx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zxyx_ = mkSwizz "zxyx"

wxyx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxyx_ = mkSwizz "wxyx"

xyx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 3
xyx_ = mkSwizz "xyx"

xyyx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
xyyx_ = mkSwizz "xyyx"

yyyx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
yyyx_ = mkSwizz "yyyx"

zyyx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zyyx_ = mkSwizz "zyyx"

wyyx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wyyx_ = mkSwizz "wyyx"

yyx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 3
yyx_ = mkSwizz "yyx"

xzyx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xzyx_ = mkSwizz "xzyx"

yzyx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yzyx_ = mkSwizz "yzyx"

zzyx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zzyx_ = mkSwizz "zzyx"

wzyx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzyx_ = mkSwizz "wzyx"

zyx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
zyx_ = mkSwizz "zyx"

xwyx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwyx_ = mkSwizz "xwyx"

ywyx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywyx_ = mkSwizz "ywyx"

zwyx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwyx_ = mkSwizz "zwyx"

wwyx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwyx_ = mkSwizz "wwyx"

wyx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wyx_ = mkSwizz "wyx"

yx_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 2
yx_ = mkSwizz "yx"

xxzx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xxzx_ = mkSwizz "xxzx"

yxzx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yxzx_ = mkSwizz "yxzx"

zxzx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zxzx_ = mkSwizz "zxzx"

wxzx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxzx_ = mkSwizz "wxzx"

xzx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
xzx_ = mkSwizz "xzx"

xyzx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xyzx_ = mkSwizz "xyzx"

yyzx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yyzx_ = mkSwizz "yyzx"

zyzx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zyzx_ = mkSwizz "zyzx"

wyzx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wyzx_ = mkSwizz "wyzx"

yzx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
yzx_ = mkSwizz "yzx"

xzzx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xzzx_ = mkSwizz "xzzx"

yzzx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yzzx_ = mkSwizz "yzzx"

zzzx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zzzx_ = mkSwizz "zzzx"

wzzx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzzx_ = mkSwizz "wzzx"

zzx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
zzx_ = mkSwizz "zzx"

xwzx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwzx_ = mkSwizz "xwzx"

ywzx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywzx_ = mkSwizz "ywzx"

zwzx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwzx_ = mkSwizz "zwzx"

wwzx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwzx_ = mkSwizz "wwzx"

wzx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wzx_ = mkSwizz "wzx"

zx_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 2
zx_ = mkSwizz "zx"

xxwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xxwx_ = mkSwizz "xxwx"

yxwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yxwx_ = mkSwizz "yxwx"

zxwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zxwx_ = mkSwizz "zxwx"

wxwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxwx_ = mkSwizz "wxwx"

xwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
xwx_ = mkSwizz "xwx"

xywx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xywx_ = mkSwizz "xywx"

yywx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yywx_ = mkSwizz "yywx"

zywx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zywx_ = mkSwizz "zywx"

wywx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wywx_ = mkSwizz "wywx"

ywx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
ywx_ = mkSwizz "ywx"

xzwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xzwx_ = mkSwizz "xzwx"

yzwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yzwx_ = mkSwizz "yzwx"

zzwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zzwx_ = mkSwizz "zzwx"

wzwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzwx_ = mkSwizz "wzwx"

zwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
zwx_ = mkSwizz "zwx"

xwwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwwx_ = mkSwizz "xwwx"

ywwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywwx_ = mkSwizz "ywwx"

zwwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwwx_ = mkSwizz "zwwx"

wwwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwwx_ = mkSwizz "wwwx"

wwx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wwx_ = mkSwizz "wwx"

wx_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 2
wx_ = mkSwizz "wx"

x_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 1
x_ = mkSwizz "x"

xxxy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
xxxy_ = mkSwizz "xxxy"

yxxy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
yxxy_ = mkSwizz "yxxy"

zxxy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zxxy_ = mkSwizz "zxxy"

wxxy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxxy_ = mkSwizz "wxxy"

xxy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 3
xxy_ = mkSwizz "xxy"

xyxy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
xyxy_ = mkSwizz "xyxy"

yyxy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
yyxy_ = mkSwizz "yyxy"

zyxy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zyxy_ = mkSwizz "zyxy"

wyxy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wyxy_ = mkSwizz "wyxy"

yxy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 3
yxy_ = mkSwizz "yxy"

xzxy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xzxy_ = mkSwizz "xzxy"

yzxy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yzxy_ = mkSwizz "yzxy"

zzxy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zzxy_ = mkSwizz "zzxy"

wzxy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzxy_ = mkSwizz "wzxy"

zxy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
zxy_ = mkSwizz "zxy"

xwxy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwxy_ = mkSwizz "xwxy"

ywxy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywxy_ = mkSwizz "ywxy"

zwxy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwxy_ = mkSwizz "zwxy"

wwxy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwxy_ = mkSwizz "wwxy"

wxy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wxy_ = mkSwizz "wxy"

xy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 2
xy_ = mkSwizz "xy"

xxyy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
xxyy_ = mkSwizz "xxyy"

yxyy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
yxyy_ = mkSwizz "yxyy"

zxyy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zxyy_ = mkSwizz "zxyy"

wxyy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxyy_ = mkSwizz "wxyy"

xyy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 3
xyy_ = mkSwizz "xyy"

xyyy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
xyyy_ = mkSwizz "xyyy"

yyyy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 4
yyyy_ = mkSwizz "yyyy"

zyyy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zyyy_ = mkSwizz "zyyy"

wyyy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wyyy_ = mkSwizz "wyyy"

yyy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 3
yyy_ = mkSwizz "yyy"

xzyy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xzyy_ = mkSwizz "xzyy"

yzyy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yzyy_ = mkSwizz "yzyy"

zzyy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zzyy_ = mkSwizz "zzyy"

wzyy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzyy_ = mkSwizz "wzyy"

zyy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
zyy_ = mkSwizz "zyy"

xwyy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwyy_ = mkSwizz "xwyy"

ywyy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywyy_ = mkSwizz "ywyy"

zwyy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwyy_ = mkSwizz "zwyy"

wwyy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwyy_ = mkSwizz "wwyy"

wyy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wyy_ = mkSwizz "wyy"

yy_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 2
yy_ = mkSwizz "yy"

xxzy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xxzy_ = mkSwizz "xxzy"

yxzy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yxzy_ = mkSwizz "yxzy"

zxzy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zxzy_ = mkSwizz "zxzy"

wxzy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxzy_ = mkSwizz "wxzy"

xzy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
xzy_ = mkSwizz "xzy"

xyzy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xyzy_ = mkSwizz "xyzy"

yyzy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yyzy_ = mkSwizz "yyzy"

zyzy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zyzy_ = mkSwizz "zyzy"

wyzy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wyzy_ = mkSwizz "wyzy"

yzy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
yzy_ = mkSwizz "yzy"

xzzy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xzzy_ = mkSwizz "xzzy"

yzzy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yzzy_ = mkSwizz "yzzy"

zzzy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zzzy_ = mkSwizz "zzzy"

wzzy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzzy_ = mkSwizz "wzzy"

zzy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
zzy_ = mkSwizz "zzy"

xwzy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwzy_ = mkSwizz "xwzy"

ywzy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywzy_ = mkSwizz "ywzy"

zwzy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwzy_ = mkSwizz "zwzy"

wwzy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwzy_ = mkSwizz "wwzy"

wzy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wzy_ = mkSwizz "wzy"

zy_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 2
zy_ = mkSwizz "zy"

xxwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xxwy_ = mkSwizz "xxwy"

yxwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yxwy_ = mkSwizz "yxwy"

zxwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zxwy_ = mkSwizz "zxwy"

wxwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxwy_ = mkSwizz "wxwy"

xwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
xwy_ = mkSwizz "xwy"

xywy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xywy_ = mkSwizz "xywy"

yywy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yywy_ = mkSwizz "yywy"

zywy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zywy_ = mkSwizz "zywy"

wywy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wywy_ = mkSwizz "wywy"

ywy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
ywy_ = mkSwizz "ywy"

xzwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xzwy_ = mkSwizz "xzwy"

yzwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yzwy_ = mkSwizz "yzwy"

zzwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zzwy_ = mkSwizz "zzwy"

wzwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzwy_ = mkSwizz "wzwy"

zwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
zwy_ = mkSwizz "zwy"

xwwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwwy_ = mkSwizz "xwwy"

ywwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywwy_ = mkSwizz "ywwy"

zwwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwwy_ = mkSwizz "zwwy"

wwwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwwy_ = mkSwizz "wwwy"

wwy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wwy_ = mkSwizz "wwy"

wy_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 2
wy_ = mkSwizz "wy"

y_ :: forall n. (Veccable n, n >= 2) => Vec n -> Vec 1
y_ = mkSwizz "y"

xxxz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xxxz_ = mkSwizz "xxxz"

yxxz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yxxz_ = mkSwizz "yxxz"

zxxz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zxxz_ = mkSwizz "zxxz"

wxxz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxxz_ = mkSwizz "wxxz"

xxz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
xxz_ = mkSwizz "xxz"

xyxz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xyxz_ = mkSwizz "xyxz"

yyxz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yyxz_ = mkSwizz "yyxz"

zyxz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zyxz_ = mkSwizz "zyxz"

wyxz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wyxz_ = mkSwizz "wyxz"

yxz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
yxz_ = mkSwizz "yxz"

xzxz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xzxz_ = mkSwizz "xzxz"

yzxz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yzxz_ = mkSwizz "yzxz"

zzxz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zzxz_ = mkSwizz "zzxz"

wzxz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzxz_ = mkSwizz "wzxz"

zxz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
zxz_ = mkSwizz "zxz"

xwxz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwxz_ = mkSwizz "xwxz"

ywxz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywxz_ = mkSwizz "ywxz"

zwxz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwxz_ = mkSwizz "zwxz"

wwxz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwxz_ = mkSwizz "wwxz"

wxz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wxz_ = mkSwizz "wxz"

xz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 2
xz_ = mkSwizz "xz"

xxyz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xxyz_ = mkSwizz "xxyz"

yxyz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yxyz_ = mkSwizz "yxyz"

zxyz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zxyz_ = mkSwizz "zxyz"

wxyz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxyz_ = mkSwizz "wxyz"

xyz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
xyz_ = mkSwizz "xyz"

xyyz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xyyz_ = mkSwizz "xyyz"

yyyz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yyyz_ = mkSwizz "yyyz"

zyyz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zyyz_ = mkSwizz "zyyz"

wyyz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wyyz_ = mkSwizz "wyyz"

yyz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
yyz_ = mkSwizz "yyz"

xzyz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xzyz_ = mkSwizz "xzyz"

yzyz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yzyz_ = mkSwizz "yzyz"

zzyz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zzyz_ = mkSwizz "zzyz"

wzyz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzyz_ = mkSwizz "wzyz"

zyz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
zyz_ = mkSwizz "zyz"

xwyz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwyz_ = mkSwizz "xwyz"

ywyz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywyz_ = mkSwizz "ywyz"

zwyz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwyz_ = mkSwizz "zwyz"

wwyz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwyz_ = mkSwizz "wwyz"

wyz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wyz_ = mkSwizz "wyz"

yz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 2
yz_ = mkSwizz "yz"

xxzz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xxzz_ = mkSwizz "xxzz"

yxzz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yxzz_ = mkSwizz "yxzz"

zxzz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zxzz_ = mkSwizz "zxzz"

wxzz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxzz_ = mkSwizz "wxzz"

xzz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
xzz_ = mkSwizz "xzz"

xyzz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xyzz_ = mkSwizz "xyzz"

yyzz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yyzz_ = mkSwizz "yyzz"

zyzz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zyzz_ = mkSwizz "zyzz"

wyzz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wyzz_ = mkSwizz "wyzz"

yzz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
yzz_ = mkSwizz "yzz"

xzzz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
xzzz_ = mkSwizz "xzzz"

yzzz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
yzzz_ = mkSwizz "yzzz"

zzzz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 4
zzzz_ = mkSwizz "zzzz"

wzzz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzzz_ = mkSwizz "wzzz"

zzz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 3
zzz_ = mkSwizz "zzz"

xwzz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwzz_ = mkSwizz "xwzz"

ywzz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywzz_ = mkSwizz "ywzz"

zwzz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwzz_ = mkSwizz "zwzz"

wwzz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwzz_ = mkSwizz "wwzz"

wzz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wzz_ = mkSwizz "wzz"

zz_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 2
zz_ = mkSwizz "zz"

xxwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xxwz_ = mkSwizz "xxwz"

yxwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yxwz_ = mkSwizz "yxwz"

zxwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zxwz_ = mkSwizz "zxwz"

wxwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxwz_ = mkSwizz "wxwz"

xwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
xwz_ = mkSwizz "xwz"

xywz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xywz_ = mkSwizz "xywz"

yywz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yywz_ = mkSwizz "yywz"

zywz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zywz_ = mkSwizz "zywz"

wywz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wywz_ = mkSwizz "wywz"

ywz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
ywz_ = mkSwizz "ywz"

xzwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xzwz_ = mkSwizz "xzwz"

yzwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yzwz_ = mkSwizz "yzwz"

zzwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zzwz_ = mkSwizz "zzwz"

wzwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzwz_ = mkSwizz "wzwz"

zwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
zwz_ = mkSwizz "zwz"

xwwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwwz_ = mkSwizz "xwwz"

ywwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywwz_ = mkSwizz "ywwz"

zwwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwwz_ = mkSwizz "zwwz"

wwwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwwz_ = mkSwizz "wwwz"

wwz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wwz_ = mkSwizz "wwz"

wz_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 2
wz_ = mkSwizz "wz"

z_ :: forall n. (Veccable n, n >= 3) => Vec n -> Vec 1
z_ = mkSwizz "z"

xxxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xxxw_ = mkSwizz "xxxw"

yxxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yxxw_ = mkSwizz "yxxw"

zxxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zxxw_ = mkSwizz "zxxw"

wxxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxxw_ = mkSwizz "wxxw"

xxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
xxw_ = mkSwizz "xxw"

xyxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xyxw_ = mkSwizz "xyxw"

yyxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yyxw_ = mkSwizz "yyxw"

zyxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zyxw_ = mkSwizz "zyxw"

wyxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wyxw_ = mkSwizz "wyxw"

yxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
yxw_ = mkSwizz "yxw"

xzxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xzxw_ = mkSwizz "xzxw"

yzxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yzxw_ = mkSwizz "yzxw"

zzxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zzxw_ = mkSwizz "zzxw"

wzxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzxw_ = mkSwizz "wzxw"

zxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
zxw_ = mkSwizz "zxw"

xwxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwxw_ = mkSwizz "xwxw"

ywxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywxw_ = mkSwizz "ywxw"

zwxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwxw_ = mkSwizz "zwxw"

wwxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwxw_ = mkSwizz "wwxw"

wxw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wxw_ = mkSwizz "wxw"

xw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 2
xw_ = mkSwizz "xw"

xxyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xxyw_ = mkSwizz "xxyw"

yxyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yxyw_ = mkSwizz "yxyw"

zxyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zxyw_ = mkSwizz "zxyw"

wxyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxyw_ = mkSwizz "wxyw"

xyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
xyw_ = mkSwizz "xyw"

xyyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xyyw_ = mkSwizz "xyyw"

yyyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yyyw_ = mkSwizz "yyyw"

zyyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zyyw_ = mkSwizz "zyyw"

wyyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wyyw_ = mkSwizz "wyyw"

yyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
yyw_ = mkSwizz "yyw"

xzyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xzyw_ = mkSwizz "xzyw"

yzyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yzyw_ = mkSwizz "yzyw"

zzyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zzyw_ = mkSwizz "zzyw"

wzyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzyw_ = mkSwizz "wzyw"

zyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
zyw_ = mkSwizz "zyw"

xwyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwyw_ = mkSwizz "xwyw"

ywyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywyw_ = mkSwizz "ywyw"

zwyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwyw_ = mkSwizz "zwyw"

wwyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwyw_ = mkSwizz "wwyw"

wyw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wyw_ = mkSwizz "wyw"

yw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 2
yw_ = mkSwizz "yw"

xxzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xxzw_ = mkSwizz "xxzw"

yxzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yxzw_ = mkSwizz "yxzw"

zxzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zxzw_ = mkSwizz "zxzw"

wxzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxzw_ = mkSwizz "wxzw"

xzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
xzw_ = mkSwizz "xzw"

xyzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xyzw_ = mkSwizz "xyzw"

yyzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yyzw_ = mkSwizz "yyzw"

zyzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zyzw_ = mkSwizz "zyzw"

wyzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wyzw_ = mkSwizz "wyzw"

yzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
yzw_ = mkSwizz "yzw"

xzzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xzzw_ = mkSwizz "xzzw"

yzzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yzzw_ = mkSwizz "yzzw"

zzzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zzzw_ = mkSwizz "zzzw"

wzzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzzw_ = mkSwizz "wzzw"

zzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
zzw_ = mkSwizz "zzw"

xwzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwzw_ = mkSwizz "xwzw"

ywzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywzw_ = mkSwizz "ywzw"

zwzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwzw_ = mkSwizz "zwzw"

wwzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwzw_ = mkSwizz "wwzw"

wzw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
wzw_ = mkSwizz "wzw"

zw_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 2
zw_ = mkSwizz "zw"

xxww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xxww_ = mkSwizz "xxww"

yxww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yxww_ = mkSwizz "yxww"

zxww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zxww_ = mkSwizz "zxww"

wxww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wxww_ = mkSwizz "wxww"

xww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
xww_ = mkSwizz "xww"

xyww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xyww_ = mkSwizz "xyww"

yyww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yyww_ = mkSwizz "yyww"

zyww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zyww_ = mkSwizz "zyww"

wyww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wyww_ = mkSwizz "wyww"

yww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
yww_ = mkSwizz "yww"

xzww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xzww_ = mkSwizz "xzww"

yzww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
yzww_ = mkSwizz "yzww"

zzww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zzww_ = mkSwizz "zzww"

wzww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wzww_ = mkSwizz "wzww"

zww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
zww_ = mkSwizz "zww"

xwww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
xwww_ = mkSwizz "xwww"

ywww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
ywww_ = mkSwizz "ywww"

zwww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
zwww_ = mkSwizz "zwww"

wwww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 4
wwww_ = mkSwizz "wwww"

www_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 3
www_ = mkSwizz "www"

ww_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 2
ww_ = mkSwizz "ww"

w_ :: forall n. (Veccable n, n >= 4) => Vec n -> Vec 1
w_ = mkSwizz "w"