diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -12,11 +12,12 @@
 - simple and pure syntax
 - standard operators (`+`, `*`, [`*^`,  `<.>`](https://hackage.haskell.org/package/vector-space))
 - compat. w/ your fav haskell goodies (higher-order functions, ADTS, swanky polymorphism).
+- compiles to GLSL
 
 ![](data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==)
 
-It comes with `hylide`, a live WebGL renderer featuring:
-- *hot-reloading*
+It comes with `hylide`, a live WebGL renderer with:
+- hot-reloading
 - audio-reactive primitives
 - texture backbuffering
 
@@ -29,7 +30,7 @@
 cabal install hylogen
 ```
 
-This will install the Hylogen package and Hylide, the live renderer.
+This will install the Hylogen package and hylide, the live renderer.
 
 ![](data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==)
 
@@ -52,7 +53,7 @@
 main = putStrLn . toGLSL $ color
 ```
 
-Run Hylide:
+Run hylide:
 
 ```
 $ hylide Main.hs
@@ -86,7 +87,7 @@
 }
 ```
 
-Hylide will recompile and and rerun `main` on file changes, sending fresh shaders to the WebGL renderer via websockets.
+Hylide will recompile and and rerun `main` on file changes, sending fresh shaders to the WebGL context via websockets.
 
 
 
@@ -95,7 +96,7 @@
 
 ## References
 - [The_Force](https://github.com/shawnlawson/The_Force) by Shawn Lawson. Live-coding audio-reactive shaders!
-- [data-reify](https://hackage.haskell.org/package/data-reify) by Andy Gill, to keep compile times from exploding by preserving sharing from the GHC Heap. 
+- [data-reify](https://hackage.haskell.org/package/data-reify) by Andy Gill, to keep intermediate AST representations from exploding by preserving the GHC heap's internal sharing
 
 ## Resources
 - [demo reel](https://hylogen.com)
diff --git a/hylogen.cabal b/hylogen.cabal
--- a/hylogen.cabal
+++ b/hylogen.cabal
@@ -1,5 +1,5 @@
 name:                hylogen
-version:             0.1.2.1
+version:             0.1.2.2
 synopsis:            an EDSL for live-coding fragment shaders
 description:         an EDSL for live-coding fragment shaders
 homepage:            https://hylogen.com
@@ -18,10 +18,10 @@
 library
   exposed-modules:     Hylogen
                      , Hylogen.Types
-                     , Hylogen.Vec
+                     , Hylogen.Types.Vec
+                     , Hylogen.Types.Booly
+                     , Hylogen.Types.Texture
                      , Hylogen.Expr
-                     , Hylogen.Booly
-                     , Hylogen.Texture
                      , Hylogen.Globals
                      , Hylogen.Program
                      , Hylogen.WithHylide
diff --git a/src/Hylogen/Booly.hs b/src/Hylogen/Booly.hs
deleted file mode 100644
--- a/src/Hylogen/Booly.hs
+++ /dev/null
@@ -1,22 +0,0 @@
-{-# LANGUAGE TypeSynonymInstances #-}
-{-# LANGUAGE FlexibleInstances #-}
-module Hylogen.Booly where
-
-import Hylogen.Expr
-
-data BoolyType = BoolyType
-instance ToGLSLType BoolyType where
-  toGLSLType _ = GLSLBool
-  tag = BoolyType
-
-type Booly = Expr BoolyType
-
-instance Num Booly where
-  (+) = op2 "||"
-  (*) = op2 "&&"
-  negate = op1 "!"
-  abs = id
-  signum = id
-  fromInteger x
-    | x > 0 = uniform "true"
-    | otherwise = uniform "false"
diff --git a/src/Hylogen/Expr.hs b/src/Hylogen/Expr.hs
--- a/src/Hylogen/Expr.hs
+++ b/src/Hylogen/Expr.hs
@@ -12,11 +12,17 @@
 {-# LANGUAGE InstanceSigs #-}
 {-# LANGUAGE DeriveFunctor #-}
 
+{- |
+Internal AST representation.
+-}
 
 module Hylogen.Expr where
 
+
 import Data.Reify
 
+
+-- | Internal type tag
 data GLSLType = GLSLFloat
               | GLSLVec2
               | GLSLVec3
@@ -34,6 +40,7 @@
     GLSLBool -> "bool"
     GLSLTexture -> "sampler2D"
 
+-- | Internal form tag
 data ExprForm = Uniform
               | Variable
               | Op1
@@ -46,11 +53,14 @@
               | Access
                 deriving (Show)
 
+-- | Rose tree. Internal AST data structure
 data Tree a  = Tree { getElem     :: a
                     , getChildren :: [Tree a]
                     }
 
 
+-- | Untyped Expr representation
+-- Carries type information in type tag
 type ExprMono = Tree (ExprForm, GLSLType, String)
 
 instance Show ExprMono where
@@ -66,9 +76,11 @@
     Select   -> mconcat ["( ", show (xs!!0), " ? ", show (xs!!1), " : ", show (xs!!2), ")"]
     Access   -> mconcat [show (xs!!0), ".", str]
 
--- The GLSLType needs to be manually dependent
-
--- light typed wrapper
+-- | Light type wrapper
+--
+-- Note the internal type tag is not directly dependent on the actual type!
+--
+-- We use the ToGLSLType typeclass to genenerate dependence from types to values
 data Expr ty = Expr { getTypeTag :: ty
                     , toMono ::  Tree (ExprForm, GLSLType, String)
                     }
@@ -77,51 +89,70 @@
   show = show . toMono
 
 class ToGLSLType  ty where
+  -- | Gives us dependence from typed singleton tags to untyped tags
   toGLSLType :: ty -> GLSLType
+  -- | Singleton tag
   tag :: ty -- TODO: fill in!
 
+-- | Uniform expression.
 uniform :: forall a
            . ToGLSLType a
            => String -> Expr a
 uniform str = Expr t (Tree (Uniform, toGLSLType t, str) [])
   where t = tag :: a
 
+-- | Unary operator.
+-- Most generally typed.
 op1 :: forall a b
        . (ToGLSLType a, ToGLSLType b)
        => String -> Expr a -> Expr b
 op1 str a = Expr t (Tree (Op1, toGLSLType t, str) [toMono a])
   where t = tag :: b
 
+-- | Unary operator.
+-- Input and output values have the same type.
 op1'' :: forall a
        . (ToGLSLType a)
        => String -> Expr a -> Expr a
 op1'' str a = Expr t (Tree (Op1, toGLSLType t, str) [toMono a])
   where t = tag :: a
 
+-- | Unary operator.
+-- Prefix function call style.
+-- Most generally typed.
 op1pre :: forall a b
           . (ToGLSLType a, ToGLSLType b)
           => String -> Expr a -> Expr b
 op1pre str a = Expr t (Tree (Op1Pre, toGLSLType t, str) [toMono a])
   where t = tag :: b
 
+-- | Unary operator.
+-- Prefix function call style.
+-- Input and output values have the same type.
 op1pre'' :: forall a
           . (ToGLSLType a)
           => String -> Expr a -> Expr a
 op1pre'' str a = Expr t (Tree (Op1Pre, toGLSLType t, str) [toMono a])
   where t = tag :: a
 
+-- | Binary operator.
+-- Most generally typed.
 op2 :: forall a b c
        . (ToGLSLType a, ToGLSLType b, ToGLSLType c)
        => String -> Expr a -> Expr b -> Expr c
 op2 str a b = Expr t (Tree (Op2, toGLSLType t, str) [toMono a, toMono b])
   where t = tag :: c
 
+-- | Binary operator.
+-- Arguments have the same type.
 op2' :: forall a c
        . (ToGLSLType a, ToGLSLType c)
        => String -> Expr a -> Expr a -> Expr c
 op2' str a b = Expr t (Tree (Op2, toGLSLType t, str) (fmap toMono [a, b]))
   where t = tag :: c
 
+-- | Binary operator.
+-- Input and output values have the same type.
 op2'' :: forall a
        . (ToGLSLType a)
        => String -> Expr a -> Expr a -> Expr a
@@ -129,36 +160,54 @@
   where t = tag :: a
 
 
+-- | Binary operator.
+-- Prefix function call style.
+-- Most generally typed.
 op2pre :: forall a b c
           . (ToGLSLType a, ToGLSLType b, ToGLSLType c)
           => String -> Expr a -> Expr b -> Expr c
 op2pre str a b = Expr t (Tree (Op2Pre, toGLSLType t, str) [toMono a, toMono b])
   where t = tag :: c
 
+-- | Binary operator.
+-- Prefix function call style.
+-- Arguments have the same type.
 op2pre' :: forall a c
        . (ToGLSLType a, ToGLSLType c)
        => String -> Expr a -> Expr a -> Expr c
 op2pre' str a b = Expr t (Tree (Op2Pre, toGLSLType t, str) (fmap toMono [a, b]))
   where t = tag :: c
 
+-- | Binary operator.
+-- Prefix function call style.
+-- Input and output values have the same type.
 op2pre'' :: forall a
        . (ToGLSLType a)
        => String -> Expr a -> Expr a -> Expr a
 op2pre'' str a b = Expr t (Tree (Op2Pre, toGLSLType t, str) (fmap toMono [a, b]))
   where t = tag :: a
 
+-- | Ternary operator.
+-- Prefix function call style.
+-- Most generally typed.
 op3pre :: forall a b c d
           . (ToGLSLType a, ToGLSLType b, ToGLSLType c, ToGLSLType d)
           => String -> Expr a -> Expr b -> Expr c -> Expr d
 op3pre str a b c = Expr t (Tree (Op3Pre, toGLSLType t, str) [toMono a, toMono b, toMono c])
   where t = tag :: d
 
+-- | Ternary operator.
+-- Prefix function call style.
+-- Arguments have the same type.
 op3pre' :: forall a d
           . (ToGLSLType a, ToGLSLType d)
           => String -> Expr a -> Expr a -> Expr a -> Expr d
 op3pre' str a b c = Expr t (Tree (Op3Pre, toGLSLType t, str) (fmap toMono [a, b, c]))
   where t = tag :: d
 
+-- | Ternary operator.
+-- Prefix function call style.
+-- Input and output values have the same type.
 op3pre'' :: forall a
           . (ToGLSLType a)
           => String -> Expr a -> Expr a -> Expr a -> Expr a
@@ -166,18 +215,27 @@
   where t = tag :: a
 
 
+-- | Quaternary operator.
+-- Prefix function call style.
+-- Most generally typed.
 op4pre :: forall a b c d e
           . (ToGLSLType a, ToGLSLType b, ToGLSLType c, ToGLSLType d, ToGLSLType e)
           => String -> Expr a -> Expr b -> Expr c -> Expr d -> Expr e
 op4pre str a b c d = Expr t (Tree (Op4Pre, toGLSLType t, str) [toMono a, toMono b, toMono c, toMono d])
   where t = tag :: e
 
+-- | Quaternary operator.
+-- Prefix function call style.
+-- Arguments have the same type.
 op4pre' :: forall a e
           . (ToGLSLType a, ToGLSLType e)
           => String -> Expr a -> Expr a -> Expr a -> Expr a -> Expr e
 op4pre' str a b c d = Expr t (Tree (Op4Pre, toGLSLType t, str) (fmap toMono [a, b, c, d]))
   where t = tag :: e
 
+-- | Quaternary operator.
+-- Prefix function call style.
+-- Input and output values have the same type.
 op4pre'' :: forall a e
           . (ToGLSLType a, ToGLSLType e)
           => String -> Expr a -> Expr a -> Expr a -> Expr a -> Expr e
@@ -187,13 +245,22 @@
 
 
 
+-- | Open tree type, to be used for explicit recursion with data-reify for preserving sharing.
+--
+-- Note the second argument of the constructor is a list of Maybe b's.
+-- We use Maybe's to determine whether or not a child expression gets inlined.
 data TreeF a b = TreeF { getElemF     :: a
                        , getChildrenF   :: [Maybe b]
                        }
                  deriving (Functor)
 
+-- | Open untyped expression representation, to be used for explicit recursion with data-reify for preserving sharing.
+--
+-- Note the presence of a list of closed ExprMono's in the tuple.
+-- We use this list to recover unshared child expressions when they need to be inlined.
 type ExprMonoF = TreeF (ExprForm, GLSLType, String, [ExprMono])
 
+-- | Returns the string representation of the nth child of an open untyped expression, accounting for inlining
 emfStringAt :: (Show a) => ExprMonoF a -> Int -> String
 emfStringAt (TreeF (_, _, _, xs) ys)  i = zipWith fn xs ys !! i
   where
@@ -215,10 +282,7 @@
     where
       strAt = emfStringAt expr
 
--- instance MuRef ExprMono where
---   type DeRef ExprMono = ExprMonoF
---   mapDeRef f (Tree tup xs) = TreeF tup <$> traverse f xs
-
+-- | Currently only inlines uniforms.
 instance MuRef ExprMono where
   type DeRef ExprMono = ExprMonoF
   mapDeRef func (Tree (form, ty, str) xs) = TreeF (form, ty, str, xs) <$> g xs
diff --git a/src/Hylogen/Globals.hs b/src/Hylogen/Globals.hs
--- a/src/Hylogen/Globals.hs
+++ b/src/Hylogen/Globals.hs
@@ -9,11 +9,11 @@
 import Hylogen.Expr
 
 
--- Geometric functions
-
+-- | Length of a vector
 len :: forall n. (Veccable n) => Vec n -> Vec1
 len = op1pre "length"
 
+-- | Euclidean distance between two points
 distance :: forall n. (Veccable n) => Vec n -> Vec n -> Vec n
 distance = op2pre'' "distance"
 
@@ -23,12 +23,29 @@
 normalize :: forall n. (Veccable n) => Vec n -> Vec n
 normalize = op1pre'' "normalize"
 
+-- | Returns a vector pointing in the same direction as another
+--
+-- @
+-- faceforward toOrient incident reference  -- == oriented
+-- @
 faceForward :: forall n. (Veccable n) => Vec n -> Vec n -> Vec n -> Vec n
 faceForward = op3pre'' "faceforward"
 
+-- | Calculates the reflection direction for an incident vector
+--
+-- @
+-- reflect incident normal -- == reflected
+-- @
 reflect :: forall n. (Veccable n) => Vec n -> Vec n -> Vec n
 reflect = op2pre'' "reflect"
 
+-- | Calculates the refraction direction direction for an incident vector
+--
+-- @
+-- refract incident normal eta -- == reflected
+-- @
+--
+-- where eta is the ratio of indicies of refraction
 refract :: forall n. (Veccable n) => Vec n -> Vec n -> Vec1 -> Vec n
 refract = op3pre "refract"
 
@@ -36,6 +53,7 @@
 inverseSqrt :: forall n. (Veccable n) => Vec n -> Vec n
 inverseSqrt = op1pre'' "inversesqrt"
 
+-- | Fractional part
 fract :: forall n. (Veccable n) => Vec n -> Vec n
 fract = op1pre'' "fract"
 
@@ -54,21 +72,27 @@
 max_ :: forall n. (Veccable n) => Vec n -> Vec n -> Vec n
 max_ = op2pre'' "max"
 
+-- | Clamps x between min and max
+--
+-- @
+-- clamp min max x -- == clamped
+-- @
 clamp :: forall n. (Veccable n) => Vec n -> Vec n -> Vec n -> Vec n
-clamp x y z = (z `min_` y) `max_` x
+clamp mn mx x = op3pre'' "clamp" x mn mx
 
 
-linexp :: (Floating a) => (a, a, a, a) -> a -> a
-linexp (a, b, c, d) x = c * ((d / c) ** ((x - a) / (b - a)))
 
-linlin :: (Floating a) => (a, a, a, a) -> a -> a
-linlin (a, b, c, d) x = c + (d - c) * ((x - a) / (b - a))
 
 
-
+-- | Linear interpolation between x and y by p, a Vec1 from 0 to 1
+--
+-- @
+-- mix p x y = x ^* (1 - p) + y ^* p
+-- -- mix 0 x y == x
+-- -- mix 1 x y == y
+-- @
 mix :: (Veccable n) => Vec1 -> Vec n -> Vec n -> Vec n
 mix p x y = op3pre "mix" x y p
--- mix p x y = x ^* (1 - p) + y ^* p
 
 true :: Booly
 true = uniform "true"
@@ -76,10 +100,10 @@
 false :: Booly
 false = uniform "false"
 
+-- | Helper function to compare vectors
 bcomp :: (Veccable v) => String -> Vec v -> Vec v -> Booly
 bcomp str x y = product $ zipWith (op2' str) (toList x) (toList y)
 
-
 eq :: (Veccable v) => Vec v -> Vec v -> Booly
 eq = bcomp "=="
 
@@ -98,9 +122,17 @@
 geq :: (Veccable v) => Vec v -> Vec v -> Booly
 geq = bcomp ">="
 
+-- | Returns rgba value given a texture and texture coordinates
+-- texture coordinates start at 0 1
 texture2D :: Texture -> Vec2 -> Vec4
 texture2D = op2pre "texture2D"
 
+-- | Selection function
+--
+-- @ sel bool x y @
+-- is akin to
+--
+-- @ bool ? x : y @ in C-like languages
 sel :: forall a
           . (ToGLSLType a)
           => Booly -> Expr a -> Expr a -> Expr a
diff --git a/src/Hylogen/Program.hs b/src/Hylogen/Program.hs
--- a/src/Hylogen/Program.hs
+++ b/src/Hylogen/Program.hs
@@ -1,18 +1,25 @@
+{- |
+Internal shader program representation.
+-}
+
 module Hylogen.Program where
 
+
 import Data.Reify
 import Data.Monoid
 import System.IO.Unsafe
 
 import Hylogen.Expr
 
--- Just for printing!
 newtype Id = Id Int
 instance Show Id where
   show (Id h) = "_" <> show h
 
+-- | Statement internal representation
+--
+-- We tag a Statement with a Unique ID and its corresponding untyped expression
 data Statement = NewAssign (Unique, ExprMonoF Unique)
-               -- | MutAssign (Unique, ExprMonoF Unique)
+               -- MutAssign (Unique, ExprMonoF Unique)
 
 getExpr :: Statement -> ExprMonoF Unique
 getExpr (NewAssign (_, expr)) = expr
@@ -23,6 +30,9 @@
   show (NewAssign (i, expr@(TreeF (_, ty, _, _) _)))
     = mconcat [ show ty, " ", show . Id $ i, " = ", show . (Id<$>) $  expr, ";"]
 
+-- | GLSL Function internal representation
+--
+-- A Function is composed of Statements.
 newtype Function = Function [Statement]
 instance Show Function where
   show (Function xs) = unlines [ "void main() {"
@@ -34,6 +44,7 @@
       assignments = mconcat $  (<> "\n") . ("    "<>) . show <$> reverse xs
 
 
+-- | Returns a program given an expression in closed untyped form
 toProgram :: ExprMono -> Function
 toProgram v = unsafePerformIO $ do
   Graph nodes _ <- reifyGraph v
diff --git a/src/Hylogen/Texture.hs b/src/Hylogen/Texture.hs
deleted file mode 100644
--- a/src/Hylogen/Texture.hs
+++ /dev/null
@@ -1,14 +0,0 @@
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE TypeSynonymInstances #-}
-{-# LANGUAGE FlexibleInstances #-}
-
-module Hylogen.Texture where
-
-import Hylogen.Expr
-
-data TextureType = TextureType
-instance ToGLSLType TextureType where
-  toGLSLType _ = GLSLTexture
-  tag = TextureType
-
-type Texture = Expr TextureType
diff --git a/src/Hylogen/Types.hs b/src/Hylogen/Types.hs
--- a/src/Hylogen/Types.hs
+++ b/src/Hylogen/Types.hs
@@ -1,9 +1,9 @@
-module Hylogen.Types ( module Hylogen.Vec
-                     , module Hylogen.Booly
-                     , module Hylogen.Texture
+module Hylogen.Types ( module Hylogen.Types.Vec
+                     , module Hylogen.Types.Booly
+                     , module Hylogen.Types.Texture
                      ) where
 
-import Hylogen.Vec hiding (FloatVec, mkSwizz)
-import Hylogen.Booly hiding (BoolyType)
-import Hylogen.Texture hiding (TextureType)
+import Hylogen.Types.Vec hiding (FloatVec, mkSwizz)
+import Hylogen.Types.Booly hiding (BoolyType)
+import Hylogen.Types.Texture hiding (TextureType)
 
diff --git a/src/Hylogen/Types/Booly.hs b/src/Hylogen/Types/Booly.hs
new file mode 100644
--- /dev/null
+++ b/src/Hylogen/Types/Booly.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE TypeSynonymInstances #-}
+{-# LANGUAGE FlexibleInstances #-}
+module Hylogen.Types.Booly where
+
+import Hylogen.Expr
+
+-- | Booly singleton type tag
+data BoolyType = BoolyType
+instance ToGLSLType BoolyType where
+  toGLSLType _ = GLSLBool
+  tag = BoolyType
+
+type Booly = Expr BoolyType
+
+-- | We use Num operators for Boolean arithmetic:
+instance Num Booly where
+  -- | Or
+  (+) = op2 "||"
+  -- | And
+  (*) = op2 "&&"
+  negate = op1 "!"
+  abs = id
+  signum = id
+  fromInteger x
+    | x > 0 = uniform "true"
+    | otherwise = uniform "false"
diff --git a/src/Hylogen/Types/Texture.hs b/src/Hylogen/Types/Texture.hs
new file mode 100644
--- /dev/null
+++ b/src/Hylogen/Types/Texture.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE TypeSynonymInstances #-}
+{-# LANGUAGE FlexibleInstances #-}
+
+module Hylogen.Types.Texture where
+
+import Hylogen.Expr
+
+-- | Texture singleton type tag
+data TextureType = TextureType
+instance ToGLSLType TextureType where
+  toGLSLType _ = GLSLTexture
+  tag = TextureType
+
+type Texture = Expr TextureType
diff --git a/src/Hylogen/Types/Vec.hs b/src/Hylogen/Types/Vec.hs
new file mode 100644
--- /dev/null
+++ b/src/Hylogen/Types/Vec.hs
@@ -0,0 +1,1194 @@
+{-# 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) = FloatVec
+
+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"
+
+
diff --git a/src/Hylogen/Vec.hs b/src/Hylogen/Vec.hs
deleted file mode 100644
--- a/src/Hylogen/Vec.hs
+++ /dev/null
@@ -1,1185 +0,0 @@
-{-# 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.Vec where
-
-import GHC.TypeLits
-import Data.VectorSpace
-
-import Hylogen.Expr
-
-
-data FloatVec (n :: Nat) = FloatVec
-
-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
-
-
-
-class (ToGLSLType (FloatVec n), KnownNat n) => Veccable n where
-  copy :: Vec1 -> Vec n
-  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
-
-
-  
-
-
-vec2 :: (Vec1, Vec1) -> Vec2
-vec2 (x, y) = op2pre' "vec2" x y
-
-
-class ToVec3 tuple where 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 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
-
-
--- Swizzling!
-type (>=) x y = (x + 1 <=? y) ~ 'False
-
-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"
-
-
diff --git a/src/Hylogen/WithHylide.hs b/src/Hylogen/WithHylide.hs
--- a/src/Hylogen/WithHylide.hs
+++ b/src/Hylogen/WithHylide.hs
@@ -12,6 +12,7 @@
 import           Data.Function
 import           Data.VectorSpace
 
+-- | Analog of @<$>@, but for @&@
 infixl 5 <&>
 (<&>) :: (Functor f) => f a -> (a -> b) -> f b
 (<&>) = flip fmap
diff --git a/src/Hylogen/WithHylide/Core.hs b/src/Hylogen/WithHylide/Core.hs
--- a/src/Hylogen/WithHylide/Core.hs
+++ b/src/Hylogen/WithHylide/Core.hs
@@ -31,27 +31,43 @@
 osc8 = uniform "osc8"
 
 
--- TODO: flip these definitions! Normalized means ??
+-- | Pixel coordinates
+--
+-- (0, 0) is the lower left corner
+--
+-- (1, 1) is the upper right corner
 uv :: Vec2
 uv = uniform "uv()"
 
+-- | Pixel coordinates
+--
+-- (0, 0) is the center of the screen
+--
+-- (1, 1) is the upper right corner
 uvN :: Vec2
 uvN = uniform "uvN"
 
+-- | Time in milliseconds since start of Hylide
 time :: Vec1
 time = uniform "time"
 
 
+-- | Resolution of the screen
 resolution :: Vec2
 resolution = uniform "resolution"
 
+-- | Mouse position
 mouse :: Vec2
 mouse = uniform "mouse"
 
 
+-- | Intensity of audio input, split into 4 bands
+--
+-- low, low-mid, mid, high
 audio :: Vec4
 audio = uniform "audio"
 
+-- | The last rendered frame
 backBuffer :: Texture
 backBuffer = uniform "backBuffer"
 
@@ -59,7 +75,9 @@
 channel1 = uniform "channel1"
 
 
--- | No sharing
+-- | Writes GLSL
+--
+-- No sharing
 toGLSL' :: Vec4 -> String
 toGLSL' v = unlines [ "void main() {"
                     , "    gl_FragColor = " <> show v <> ";"
@@ -67,6 +85,8 @@
                     ]
 
 
--- | sharing via Data.reify
+-- | Writes GLSL
+--
+-- Sharing via Data.reify
 toGLSL :: Vec4 -> String
 toGLSL = show . toProgram . toMono
diff --git a/src/Hylogen/WithHylide/Util.hs b/src/Hylogen/WithHylide/Util.hs
--- a/src/Hylogen/WithHylide/Util.hs
+++ b/src/Hylogen/WithHylide/Util.hs
@@ -2,15 +2,39 @@
 
 import Hylogen
 
--- Colors
 black :: Vec3
 black = vec3 (0, 0, 0)
 
 white :: Vec3
 white = vec3 (1, 1, 1)
 
+-- | Given an alpha value, sets it for the alpha channel for a given color
+--
+-- @
+-- setAlpha alpha color -- == n newColor
+-- @
 setAlpha :: Vec1 -> Vec4 -> Vec4
 setAlpha alpha v = vec4 (xyz_ v, alpha)
 
 -- TODO: hsl
 
+
+-- | Linear to Exponential Map
+--
+-- @
+-- linexp (a, b, c, d) a           -- == c
+-- linexp (a, b, c, d) b           -- == d
+-- linexp (a, b, c, d) ((a + b)\/2) -- == c * sqrt(d/c)
+-- @
+linexp :: (Floating a) => (a, a, a, a) -> a -> a
+linexp (a, b, c, d) x = c * ((d / c) ** ((x - a) / (b - a)))
+
+-- | Linear to Linear map
+--
+-- @
+-- linexp (a, b, c, d) a           -- == c
+-- linexp (a, b, c, d) b           -- == d
+-- linexp (a, b, c, d) ((a + b)\/2) -- == ((c + d)/2)
+-- @
+linlin :: (Floating a) => (a, a, a, a) -> a -> a
+linlin (a, b, c, d) x = c + (d - c) * ((x - a) / (b - a))
