content: {-# 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"
  
  
  