diff --git a/src/Data/Constraint/Struct.hs b/src/Data/Constraint/Struct.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Constraint/Struct.hs
@@ -0,0 +1,68 @@
+module Data.Constraint.Struct where
+
+import Data.Constraint
+
+type family Recursive (c :: Constraint) :: Constraint where
+    Recursive () = ()
+    Recursive (t1,t2) = (Recursive t1, (Recursive t2, ()))
+    Recursive (t1,t2,t3) = (Recursive t1, (Recursive t2, (Recursive t3, ())))
+    Recursive (t1,t2,t3,t4) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, ()))))
+    Recursive (t1,t2,t3,t4,t5) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, ())))))
+    Recursive (t1,t2,t3,t4,t5,t6) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, ()))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, ())))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, ()))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, ())))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, ()))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, ())))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, ()))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, ())))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, ()))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, ())))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, ()))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, ())))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, ()))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, ())))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, ()))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, ())))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, ()))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, ())))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, ()))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, ())))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, ()))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, ())))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, ()))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, ())))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, ()))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, ())))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, ()))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, ())))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, ()))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, ())))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, ()))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, ())))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, ()))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, ())))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, ()))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, ())))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, ()))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, ())))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, ()))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, ())))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, ()))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, ())))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, ()))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, ())))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, (Recursive t50, ()))))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50,t51) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, (Recursive t50, (Recursive t51, ())))))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50,t51,t52) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, (Recursive t50, (Recursive t51, (Recursive t52, ()))))))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50,t51,t52,t53) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, (Recursive t50, (Recursive t51, (Recursive t52, (Recursive t53, ())))))))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50,t51,t52,t53,t54) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, (Recursive t50, (Recursive t51, (Recursive t52, (Recursive t53, (Recursive t54, ()))))))))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50,t51,t52,t53,t54,t55) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, (Recursive t50, (Recursive t51, (Recursive t52, (Recursive t53, (Recursive t54, (Recursive t55, ())))))))))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50,t51,t52,t53,t54,t55,t56) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, (Recursive t50, (Recursive t51, (Recursive t52, (Recursive t53, (Recursive t54, (Recursive t55, (Recursive t56, ()))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50,t51,t52,t53,t54,t55,t56,t57) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, (Recursive t50, (Recursive t51, (Recursive t52, (Recursive t53, (Recursive t54, (Recursive t55, (Recursive t56, (Recursive t57, ())))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50,t51,t52,t53,t54,t55,t56,t57,t58) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, (Recursive t50, (Recursive t51, (Recursive t52, (Recursive t53, (Recursive t54, (Recursive t55, (Recursive t56, (Recursive t57, (Recursive t58, ()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50,t51,t52,t53,t54,t55,t56,t57,t58,t59) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, (Recursive t50, (Recursive t51, (Recursive t52, (Recursive t53, (Recursive t54, (Recursive t55, (Recursive t56, (Recursive t57, (Recursive t58, (Recursive t59, ())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50,t51,t52,t53,t54,t55,t56,t57,t58,t59,t60) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, (Recursive t50, (Recursive t51, (Recursive t52, (Recursive t53, (Recursive t54, (Recursive t55, (Recursive t56, (Recursive t57, (Recursive t58, (Recursive t59, (Recursive t60, ()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50,t51,t52,t53,t54,t55,t56,t57,t58,t59,t60,t61) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, (Recursive t50, (Recursive t51, (Recursive t52, (Recursive t53, (Recursive t54, (Recursive t55, (Recursive t56, (Recursive t57, (Recursive t58, (Recursive t59, (Recursive t60, (Recursive t61, ())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive (t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50,t51,t52,t53,t54,t55,t56,t57,t58,t59,t60,t61,t62) = (Recursive t1, (Recursive t2, (Recursive t3, (Recursive t4, (Recursive t5, (Recursive t6, (Recursive t7, (Recursive t8, (Recursive t9, (Recursive t10, (Recursive t11, (Recursive t12, (Recursive t13, (Recursive t14, (Recursive t15, (Recursive t16, (Recursive t17, (Recursive t18, (Recursive t19, (Recursive t20, (Recursive t21, (Recursive t22, (Recursive t23, (Recursive t24, (Recursive t25, (Recursive t26, (Recursive t27, (Recursive t28, (Recursive t29, (Recursive t30, (Recursive t31, (Recursive t32, (Recursive t33, (Recursive t34, (Recursive t35, (Recursive t36, (Recursive t37, (Recursive t38, (Recursive t39, (Recursive t40, (Recursive t41, (Recursive t42, (Recursive t43, (Recursive t44, (Recursive t45, (Recursive t46, (Recursive t47, (Recursive t48, (Recursive t49, (Recursive t50, (Recursive t51, (Recursive t52, (Recursive t53, (Recursive t54, (Recursive t55, (Recursive t56, (Recursive t57, (Recursive t58, (Recursive t59, (Recursive t60, (Recursive t61, (Recursive t62, ()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+    Recursive t1 = (t1, ())
diff --git a/src/Data/Constraints.hs b/src/Data/Constraints.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Constraints.hs
@@ -0,0 +1,7 @@
+module Data.Constraints where
+
+import Data.Constraint
+
+type family Constraints (cs :: [Constraint]) :: Constraint where
+    Constraints '[]       = ()
+    Constraints (c ': cs) = (c , Constraints cs)
diff --git a/src/Data/Proxify.hs b/src/Data/Proxify.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Proxify.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE PolyKinds #-}
+
+module Data.Proxify (module Data.Proxify, module X) where
+
+import Data.Proxy as X
+
+
+-- === Utils === --
+
+type family Proxified a where
+    Proxified (Proxy a) = a
+    Proxified a         = a
+
+proxify :: a -> Proxy (Proxified a)
+proxify _ = Proxy
+
+
+type family Deproxy p where Deproxy (Proxy a) = a
diff --git a/src/Type/Any.hs b/src/Type/Any.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Any.hs
@@ -0,0 +1,5 @@
+{-# LANGUAGE TypeInType #-}
+
+module Type.Any where
+
+type family AnyType :: k
diff --git a/src/Type/Applicative.hs b/src/Type/Applicative.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Applicative.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE PolyKinds            #-}
+
+module Type.Applicative (module Type.Applicative, module X) where
+
+import Type.Functor as X
+import Type.Monoid
+
+
+infixl 4 <*>
+type a <*> b = AppBind a b
+
+type family AppBind a b where
+            AppBind a '[] = '[]
+            AppBind a (b ': bs) = AppBind' a b <> AppBind a bs
+
+type family AppBind' a b where
+            AppBind' '[]       b = '[]
+            AppBind' (a ': as) b = a b ': AppBind' as b
diff --git a/src/Type/Bool.hs b/src/Type/Bool.hs
--- a/src/Type/Bool.hs
+++ b/src/Type/Bool.hs
@@ -17,7 +17,9 @@
   Not 'True  = 'False
   Not 'False = 'True
 
-type family And a b where
+infixr 3 &&
+type a && b = And a b
+type family   And a b where
   And 'True 'True = 'True
   And a      b    = 'False
 
@@ -42,16 +44,16 @@
   If' 'True  a b = a
   If' 'False a b = b
 
-type family (a :: k) == (b :: l) where
+type family (a :: k) == (b :: k) where
     a == a = 'True
     a == b = 'False
 
+type family (a :: k) > (b :: k) :: Bool
+type family (a :: k) < (b :: k) :: Bool
 
+
 -- === Type level queries ===
 
 class    KnownBool (b :: Bool) where boolVal :: Proxy b -> Bool
 instance KnownBool True        where boolVal _ = True
 instance KnownBool False       where boolVal _ = False
-
-
-
diff --git a/src/Type/Container.hs b/src/Type/Container.hs
--- a/src/Type/Container.hs
+++ b/src/Type/Container.hs
@@ -9,7 +9,8 @@
 
 type family In     (el :: ke) (cont :: k) :: Bool
 type family Index2 (idx :: i) (cont :: c) :: el
-type family Index  (el :: ke) (cont :: k) :: Maybe Nat
+type family Index  (el :: ke) (cont :: k) :: Maybe Nat -- TODO: refactor to TryIndex or LookupIndex
+type family IndexF (el :: ke) (cont :: k) :: Nat
 type family Append (el :: ke) (cont :: k) :: k
 type family Insert (el :: ke) (cont :: k) :: k
 type family Remove (el :: ke) (cont :: k) :: k
@@ -20,16 +21,16 @@
 
 type family Unique            (cont :: k) :: k
 
-type family Concat (a :: k) (b :: k) :: k
 
+
 type family Diff  (c :: k) (c' :: k) :: k
 type family Union (c :: k) (c' :: k) :: k
 
+type family Every a :: [*]
+
 --infixr 6      :<>
 --type family (a :: k) :<> (b :: k) where a :<> b = Concat a b
 
-infixr 6      <>
-type family (a :: k) <> (b :: k) where a <> b = Concat a b
 
 
 
diff --git a/src/Type/Error.hs b/src/Type/Error.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Error.hs
@@ -0,0 +1,29 @@
+{-# LANGUAGE UndecidableInstances #-}
+
+module Type.Error (module Type.Error, module X) where
+
+import GHC.TypeLits as X (ErrorMessage (ShowType, (:<>:), (:$$:)), TypeError)
+import GHC.TypeLits      (ErrorMessage (Text))
+
+
+-- === ErrMsg === --
+
+type ErrMsg = 'Text
+
+
+-- === Assertions === --
+class                     TypeErrorIf (ok :: Bool) (err :: ErrorMessage)
+instance                  TypeErrorIf 'True  err
+instance TypeError err => TypeErrorIf 'False err
+
+type TypeAssert ok = TypeErrorIf ok (ErrMsg "Assertion failed.")
+
+
+-- === Formatters === --
+
+type Sentence a     = a :<>: ErrMsg "."
+type Ticked   a     = Between' "`" a
+type Parensed a     = Between "(" ")" a
+type Between  l r a = ErrMsg l :<>: a :<>: ErrMsg r
+type Between' s   a = Between s s a
+type a :</>: b      = a :<>: ErrMsg " " :<>: b
diff --git a/src/Type/Error_old.hs b/src/Type/Error_old.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Error_old.hs
@@ -0,0 +1,29 @@
+{-# LANGUAGE UndecidableInstances #-}
+
+module Type.Error_old (module Type.Error_old, module X) where
+
+import GHC.TypeLits as X (ErrorMessage (ShowType, (:<>:), (:$$:)), TypeError)
+import GHC.TypeLits      (ErrorMessage (Text))
+
+
+-- === ErrMsg === --
+
+type ErrMsg = 'Text
+
+
+-- === Assertions === --
+class                     Assert (ok :: Bool) (err :: ErrorMessage)
+instance                  Assert 'True  err
+instance TypeError err => Assert 'False err
+
+type Assert' ok = Assert ok (ErrMsg "Assertion failed.")
+
+
+-- === Formatters === --
+
+type Sentence a     = a :<>: ErrMsg "."
+type Ticked   a     = Between' "`" a
+type Parensed a     = Between "(" ")" a
+type Between  l r a = ErrMsg l :<>: a :<>: ErrMsg r
+type Between' s   a = Between s s a
+type a :</>: b  = a :<>: ErrMsg " " :<>: b
diff --git a/src/Type/Functor.hs b/src/Type/Functor.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Functor.hs
@@ -0,0 +1,11 @@
+{-# LANGUAGE PolyKinds #-}
+
+module Type.Functor where
+
+
+infixl 4 <$>
+
+type f <$> as = FMap f as
+type family FMap (f :: l -> k) (as :: [l]) :: [k] where
+            FMap f             '[]         = '[]
+            FMap f             (a ': as)   = f a ': FMap f as
diff --git a/src/Type/Hidden.hs b/src/Type/Hidden.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Hidden.hs
@@ -0,0 +1,20 @@
+module Type.Hidden where
+
+import Prelude
+import Unsafe.Coerce
+
+class Hidden t where
+    hide   :: a -> t
+    reveal :: t -> a
+
+data Any where
+    Any :: a -> Any
+
+instance Show Any where
+    show _ = "Hidden"
+
+instance Hidden Any where
+    hide              = Any
+    reveal (Any a) = unsafeCoerce a
+
+
diff --git a/src/Type/Inference.hs b/src/Type/Inference.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Inference.hs
@@ -0,0 +1,55 @@
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE PolyKinds            #-}
+{-# LANGUAGE RankNTypes           #-}
+{-# LANGUAGE TypeApplications     #-}
+{-# LANGUAGE AllowAmbiguousTypes  #-}
+{-# LANGUAGE ScopedTypeVariables  #-}
+
+module Type.Inference where
+
+import Prelude
+import Data.Typeable
+
+import Control.Applicative
+import Control.Lens
+import Control.Monad.Catch
+import Control.Monad.Fix
+import Control.Monad.Identity
+import Control.Monad.Trans
+import Control.Monad.Trans.Identity
+import Control.Monad.Primitive
+import GHC.Exts (Constraint)
+
+
+-- === Definitions ===
+
+-- | The Inferable type class describes a monad with a functional dependency on the given type.
+--   It allows for writing polymorphic code and ensuring Haskell that the type will be resolved while
+--   evaluating the monadic stack.
+
+type    KnownType  cls t = KnownTypeT cls t Identity
+newtype KnownTypeT (cls :: ck) (t :: tk) (m :: * -> *) (a :: *) = KnownTypeT (IdentityT m a) deriving (Show, Functor, Monad, MonadIO, MonadFix, MonadTrans, Applicative, MonadThrow, MonadCatch, MonadMask, MonadPlus, Alternative)
+makeWrapped ''KnownTypeT
+
+type family Infer (p :: k) m where
+    Infer p (KnownTypeT p t m) = t
+    Infer p (t m)              = Infer p m
+
+type family TryInfer (p :: k) m a :: Constraint where
+    TryInfer p (KnownTypeT p t m) a = (a ~ t)
+    TryInfer p (t m)              a = TryInfer p m a
+    TryInfer p m                  a = ()
+
+
+-- === Utils === --
+
+inferT :: forall cls t m a. KnownTypeT cls t m a -> m a
+inferT = runIdentityT . view _Wrapped'
+
+
+-- === Instances ===
+
+-- Primitive
+instance PrimMonad m => PrimMonad (KnownTypeT cls t m) where
+    type PrimState (KnownTypeT cls t m) = PrimState m
+    primitive = lift . primitive
diff --git a/src/Type/Known.hs b/src/Type/Known.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Known.hs
@@ -0,0 +1,40 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE TypeApplications    #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeInType          #-}
+
+module Type.Known (module Type.Known, module X) where
+
+import GHC.TypeLits as X (KnownNat, KnownSymbol)
+
+import Prelude
+import Data.Convert
+import Data.Kind (Type)
+import Data.Proxy
+import GHC.TypeLits
+
+
+----------------------------------------
+-- === Types to values conversion === --
+----------------------------------------
+
+-- === Definition === --
+
+class KnownType t where fromType :: KnownTypeVal t
+
+type family KnownTypeVal (t   :: k)    where KnownTypeVal (t :: k) = KnownKindVal k
+type family KnownKindVal (nat :: Type) where KnownKindVal Nat      = Integer
+                                             KnownKindVal Symbol   = String
+                                             KnownKindVal t        = t
+
+
+-- === Utils === --
+
+fromType' :: forall t s. (KnownType t, Convertible' (KnownTypeVal t) s) => s
+fromType' = convert' $ fromType @t ; {-# INLINE fromType' #-}
+
+
+-- === Instances === --
+
+instance KnownNat    t => KnownType (t :: Nat)    where fromType = natVal    (Proxy @t) ; {-# INLINE fromType #-}
+instance KnownSymbol t => KnownType (t :: Symbol) where fromType = symbolVal (Proxy @t) ; {-# INLINE fromType #-}
diff --git a/src/Type/List.hs b/src/Type/List.hs
--- a/src/Type/List.hs
+++ b/src/Type/List.hs
@@ -7,15 +7,14 @@
 {-# LANGUAGE PolyKinds            #-}
 {-# LANGUAGE ScopedTypeVariables            #-}
 
-module Type.List where
+module Type.List (module Type.List, module X) where
 
-import Data.Typeable
 import Prelude
-import GHC.Exts (Constraint)
 import GHC.TypeLits
 import Type.Bool
-import Type.Container
+import Type.Container as X
 import qualified Type.Set as Set
+import Type.Monoid as X
 
 -- === Wrappers ===
 
@@ -27,7 +26,7 @@
 
 type family Removed    (el :: e)    (cont :: c) :: l
 type family RemovedIdx (idx :: Nat) (cont :: c) :: l
-type family ElAt       (idx :: Nat) (cont :: c) :: l 
+type family ElAt       (idx :: Nat) (cont :: c) :: l
 
 type instance Removed (el :: e) ((l ': ls) :: [e]) = If (el == l) ls (l ': Removed el ls)
 
@@ -37,21 +36,24 @@
 type instance ElAt idx (l ': ls) = If (idx == 0) l (ElAt (idx - 1) ls)
 
 
-type instance In a (l ': ls) = If (a == l) True (In a ls)
-type instance In a '[]       = False
+type instance In a (l ': ls) = If (a == l) 'True (In a ls)
+type instance In a '[]       = 'False
 
 
-type family SuccMaybe (m :: Maybe Nat) where SuccMaybe (Just n) = Just (n + 1)
-                                             SuccMaybe Nothing  = Nothing
+type family SuccMaybe (m :: Maybe Nat) where SuccMaybe ('Just n) = 'Just (n + 1)
+                                             SuccMaybe 'Nothing  = 'Nothing
 
-type instance Index a (l ': ls) = If (a == l) (Just 0) (SuccMaybe (Index a ls))
-type instance Index a '[]       = (Nothing :: Maybe Nat)
+type instance Index a (l ': ls) = If (a == l) ('Just 0) (SuccMaybe (Index a ls))
+type instance Index a '[]       = ('Nothing :: Maybe Nat)
 
+type instance IndexF a (l ': ls) = If (a == l) 0 (IndexF a ls + 1)
 
+
 data Recursive a
 
-type instance Index a (Recursive (l ': ls)) = If (a == l) (Just 0) (SuccMaybe (Index a (Recursive ls)))
-type instance Index a (Recursive '[]      ) = (Nothing :: Maybe Nat)
+-- TODO: rename to IndexOf
+type instance Index a (Recursive (l ': ls)) = If (a == l) ('Just 0) (SuccMaybe (Index a (Recursive ls)))
+type instance Index a (Recursive '[]      ) = ('Nothing :: Maybe Nat)
 
 
 --type family Index2 (idx :: i) (cont :: c) :: el
@@ -67,8 +69,8 @@
 type instance Append a (l ': ls) = l ': Append a ls
 
 
-type instance Concat (lst :: [k]) ('[]       :: [k]) = lst
-type instance Concat (lst :: [k]) ((l ': ls) :: [k]) = Concat (Append l lst) ls
+type instance Concat ('[] :: [k])        (lst :: [k]) = lst
+type instance Concat ( (l ': ls) :: [k]) (lst :: [k]) = l ': Concat ls lst
 
 
 type instance Remove a '[] = '[]
@@ -89,7 +91,7 @@
 
 --type instance Unique (lst :: [k]) = Set.ToList (Set.AsSet lst)
 
--- FIXME[WD]: The following is just an fix for using Unique. 
+-- FIXME[WD]: The following is just an fix for using Unique.
 --            Due to lack of time this ugly fix has no background - probably some PolyKinded problem.
 type family UniqueFix lst where UniqueFix '[] = '[]
                                 UniqueFix lst = Unique lst
@@ -98,14 +100,18 @@
 type instance Reverse (lst :: [k]) = Reverse' lst '[]
 
 type family Reverse' lst lst' where
-    Reverse' '[] lst = lst
+    Reverse' '[]       lst = lst
     Reverse' (l ': ls) lst = Reverse' ls (l ': lst)
 
 
 type family Take (n :: Nat) lst where
-	Take 0 lst       = '[]
-	Take n (l ': ls) = l ': Take (n - 1) ls
+    Take 0 lst       = '[]
+    Take n (l ': ls) = l ': Take (n - 1) ls
 
+type family Drop (n :: Nat) lst where
+    Drop 0 lst       = lst
+    Drop n (l ': ls) = Drop (n - 1) ls
+
 --type instance Index (a :: *) (Recursive ((l ': ls) ::  [*] )) = If (a == l) (Just 0) (SuccMaybe (Index a (Recursive ls)))
 --type instance Index (a :: *) (Recursive ((l ': ls) :: [[*]])) = If (Index a l == 'Nothing) (SuccMaybe (Index a (Recursive ls))) ('Just 0)
 --type instance Index a '[]                                     = 'Nothing
@@ -113,3 +119,92 @@
 
 --type instance RecIndex a ((l ': ls) :: [[*]]) = If (RecIndex a l == 'Nothing) (SuccMaybe (RecIndex a ls)) (Just 0)
 
+type family Join (lst :: [[k]]) :: [k] where
+    Join '[]           = '[]
+    Join (lst ': lsts) = Concat lst (Join lsts)
+
+type family Last (lst :: [k]) :: k where
+    Last '[x]      = x
+    Last (x ': xs) = Last xs
+
+
+type family Init (lst :: [k]) :: [k] where
+    Init '[]       = '[]
+    Init '[x]      = '[]
+    Init (x ': xs) = x ': Init xs
+
+type family DropInit (lst :: [k]) :: [k] where
+    DropInit '[]       = '[]
+    DropInit '[x]      = '[x]
+    DropInit (x ': xs) = DropInit xs
+
+type family Replicate (n :: Nat) a where
+    Replicate 0 a = '[]
+    Replicate n a = a ': Replicate (n - 1) a
+
+
+type Zip a b = Zip2 a b
+
+type family Zip2 (l1 :: [*]) (l2 :: [*]) :: [*] where
+    Zip2 (x1 ': xs1) (x2 ': xs2) = (x1,x2) ': Zip2 xs1 xs2
+    Zip2 l1          l2          = '[]
+
+type family Zip3 (l1 :: [*]) (l2 :: [*]) (l3 :: [*]) :: [*] where
+    Zip3 (x1 ': xs1) (x2 ': xs2) (x3 ': xs3) = (x1,x2,x3) ': Zip3 xs1 xs2 xs3
+    Zip3 l1          l2          l3          = '[]
+
+type family Zip4 (l1 :: [*]) (l2 :: [*]) (l3 :: [*]) (l4 :: [*]) :: [*] where
+    Zip4 (x1 ': xs1) (x2 ': xs2) (x3 ': xs3) (x4 ': xs4) = (x1,x2,x3,x4) ': Zip4 xs1 xs2 xs3 xs4
+    Zip4 l1          l2          l3          l4          = '[]
+
+type family Zip5 (l1 :: [*]) (l2 :: [*]) (l3 :: [*]) (l4 :: [*]) (l5 :: [*]) :: [*] where
+    Zip5 (x1 ': xs1) (x2 ': xs2) (x3 ': xs3) (x4 ': xs4) (x5 ': xs5) = (x1,x2,x3,x4,x5) ': Zip5 xs1 xs2 xs3 xs4 xs5
+    Zip5 l1          l2          l3          l4          l5          = '[]
+
+
+type family Unzip2 (lst :: [*]) :: ([*], [*]) where
+    Unzip2 '[]              = '( '[], '[] )
+    Unzip2 ((x1,x2) ': lst) = PrependAll (x1,x2) (Unzip2 lst)
+
+--type family Unzip3 (lst :: [*]) :: ([*], [*], [*]) where
+--    Unzip3 '[]              = '( '[], '[] )
+--    Unzip3 ((x1,x2) ': lst) = PrependAll (x1,x2) (Unzip3 lst)
+
+
+type family PrependAll (els :: *) (lsts :: k) :: k
+type instance PrependAll (t1,t2) '(l1,l2) = '(t1 ': l1, t2 ': l2)
+type instance PrependAll (t1,t2,t3) '(l1,l2,l3) = '(t1 ': l1, t2 ': l2, t3 ': l3)
+type instance PrependAll (t1,t2,t3,t4) '(l1,l2,l3,l4) = '(t1 ': l1, t2 ': l2, t3 ': l3, t4 ': l4)
+type instance PrependAll (t1,t2,t3,t4,t5) '(l1,l2,l3,l4,l5) = '(t1 ': l1, t2 ': l2, t3 ': l3, t4 ': l4, t5 ': l5)
+
+
+type family Select (n :: Nat) (a :: *) :: *
+
+type instance Select 1 (t1,t2) = t1
+type instance Select 2 (t1,t2) = t2
+
+type instance Select 1 (t1,t2,t3) = t1
+type instance Select 2 (t1,t2,t3) = t2
+type instance Select 3 (t1,t2,t3) = t3
+
+type instance Select 1 (t1,t2,t3,t4) = t1
+type instance Select 2 (t1,t2,t3,t4) = t2
+type instance Select 3 (t1,t2,t3,t4) = t3
+type instance Select 4 (t1,t2,t3,t4) = t4
+
+type instance Select 1 (t1,t2,t3,t4,t5) = t1
+type instance Select 2 (t1,t2,t3,t4,t5) = t2
+type instance Select 3 (t1,t2,t3,t4,t5) = t3
+type instance Select 4 (t1,t2,t3,t4,t5) = t4
+type instance Select 5 (t1,t2,t3,t4,t5) = t5
+
+
+
+type family Update (n :: Nat) (a :: k) (lst :: [k]) :: [k] where
+    Update 0 a (l ': ls) = a ': ls
+    Update n a (l ': ls) = l ': Update (n - 1) a ls
+
+type family TakeUntil (a :: k) (ls :: [k]) :: [k] where
+    TakeUntil a '[]       = '[]
+    TakeUntil a (a ': ls) = '[a]
+    TakeUntil a (l ': ls) = l ': TakeUntil a ls
diff --git a/src/Type/Map.hs b/src/Type/Map.hs
--- a/src/Type/Map.hs
+++ b/src/Type/Map.hs
diff --git a/src/Type/Maybe.hs b/src/Type/Maybe.hs
--- a/src/Type/Maybe.hs
+++ b/src/Type/Maybe.hs
@@ -12,3 +12,6 @@
     CatMaybes '[]              = '[]
     CatMaybes ('Just a  ': ms) = a ': CatMaybes ms
     CatMaybes ('Nothing ': ms) =      CatMaybes ms
+
+type family FromJust (m :: Maybe k) :: k where
+    FromJust ('Just a) = a
diff --git a/src/Type/Monoid.hs b/src/Type/Monoid.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Monoid.hs
@@ -0,0 +1,7 @@
+{-# LANGUAGE PolyKinds #-}
+
+module Type.Monoid where
+
+infixr 6 <>
+type a <> b = Concat a b
+type family Concat (a :: k) (b :: k) :: k
diff --git a/src/Type/Operators.hs b/src/Type/Operators.hs
--- a/src/Type/Operators.hs
+++ b/src/Type/Operators.hs
@@ -18,7 +18,15 @@
 
 
 
-infixr 0 $
+-- | The `$$` operator is just like `$` one but with even lower precedence level.
+--   Unlike value-level `$`, the type-level one has precedence level of `infixr 1`
+--   in order to be used in function arguments, like `edge :: Node $ Source a -> Node $ Target a -> a`.
+--   The `$$` operator has higher precedence than `->`, so the above expression would not be valid when using it.
+
+infixr 0 $$
+type f $$ a = f a
+
+infixr 1 $
 type f $ a = f a
 
 infixl 1 &
diff --git a/src/Type/Promotion.hs b/src/Type/Promotion.hs
--- a/src/Type/Promotion.hs
+++ b/src/Type/Promotion.hs
@@ -3,7 +3,7 @@
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE PolyKinds #-}
 
-module Type.Promotion where
+module Type.Promotion {-# DEPRECATED "Use Type.Known instead" #-} where
 
 import Prelude
 
@@ -41,3 +41,8 @@
 -- Lists
 instance Known ('[]) [a] where typeVal _ = []
 instance (Known t a, Known ts [a]) => Known (t ': ts) [a] where typeVal _ = typeVal (Proxy :: Proxy t) : typeVal (Proxy :: Proxy ts)
+
+-- KnownNats
+class                                  KnownNats (nats :: [Nat]) where natVals :: Proxy nats -> [Integer]
+instance                               KnownNats '[]             where natVals _ = []                                                      ; {-# INLINE natVals #-}
+instance (KnownNat n, KnownNats ns) => KnownNats (n ': ns)       where natVals _ = natVal (Proxy :: Proxy n) : natVals (Proxy :: Proxy ns) ; {-# INLINE natVals #-}
diff --git a/src/Type/Relation.hs b/src/Type/Relation.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Relation.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE PolyKinds #-}
+
+module Type.Relation where
+
+
+type family Super (a :: k) :: [k]
+
+
+type SemiSuper a = a ': Super a
diff --git a/src/Type/Set.hs b/src/Type/Set.hs
--- a/src/Type/Set.hs
+++ b/src/Type/Set.hs
@@ -6,16 +6,13 @@
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE PolyKinds            #-}
 
-module Type.Set where
+module Type.Set (module Type.Set, module X) where
 
-import Data.Typeable
-import Prelude
-import GHC.Exts (Constraint)
-import GHC.TypeLits
 import Type.Bool
 import Type.Container
 import Type.Wrapped
 import Type.Operators
+import Type.Monoid as X
 
 
 -- === Declarations ===
diff --git a/src/Type/Show.hs b/src/Type/Show.hs
--- a/src/Type/Show.hs
+++ b/src/Type/Show.hs
@@ -1,7 +1,9 @@
 {-# LANGUAGE ScopedTypeVariables  #-}
 {-# LANGUAGE PolyKinds            #-}
 {-# LANGUAGE ScopedTypeVariables  #-}
+{-# LANGUAGE AllowAmbiguousTypes  #-}
 {-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE TypeApplications     #-}
 
 module Type.Show where
 
@@ -9,50 +11,51 @@
 import Data.Typeable
 import Data.Monoid
 import GHC.TypeLits
+import Control.Monad.IO.Class
 import Text.Show.Pretty (ppValue, parseValue)
 import Text.PrettyPrint (Doc, text)
 import GHC.Exts         (Constraint)
 
---showType :: Typeable a => a -> String
---showType (a :: a) = showProxyType (Proxy :: Proxy a)
 
---showProxyType :: Typeable (Proxy a) => Proxy a -> String
---showProxyType = clear . drop 6 . show . typeOf where
---    clear = \case ('(':s)     -> init  s
---                  ('*':' ':s) -> clear s -- PolyKinded Proxies are shown as "Proxy *"
---                  s           -> s
+----------------------
+-- === TypeShow === --
+----------------------
 
+-- === Definition === --
 
-class TypeShow a where showType :: Proxy (a :: k) -> String
+class Typeable a => TypeShow a where
+    showType :: String
 
-printType :: TypeShow a => Proxy a -> IO ()
-printType = putStrLn . showType
+instance {-# OVERLAPPABLE #-} Typeable a => TypeShow a where
+    showType = show $ typeRep (Proxy :: Proxy a) ; {-# INLINE showType #-}
 
-ppPrintType :: TypeShow a => Proxy a -> IO ()
-ppPrintType = putStrLn . ppShowType
 
-ppShowType :: TypeShow a => Proxy a -> String
-ppShowType = show . ppTypeDoc
+-- === Utils === --
 
-ppTypeDoc :: TypeShow a => Proxy a -> Doc
-ppTypeDoc a = case parseValue txt of
+printType, ppPrintType :: forall a m. (TypeShow a, MonadIO m) => m ()
+printType   = liftIO . putStrLn $ showType   @a ; {-# INLINE printType   #-}
+ppPrintType = liftIO . putStrLn $ ppShowType @a ; {-# INLINE ppPrintType #-}
+
+ppShowType :: forall a. TypeShow a => String
+ppTypeDoc  :: forall a. TypeShow a => Doc
+ppShowType = show $ ppTypeDoc @a ; {-# INLINE ppShowType #-}
+ppTypeDoc  = case parseValue txt of
             Just v  -> ppValue v
             Nothing -> text txt
-  where txt = showType a
-
+  where txt = showType @a
+{-# INLINE ppTypeDoc #-}
 
 
 -- === Basic Instances === --
 
-instance KnownNat n               => TypeShow (n :: Nat) where showType _ = show $ natVal (Proxy :: Proxy n)
-instance ListElemsShow a          => TypeShow (a :: [k]) where showType _ = "[" <> showListElems (Proxy :: Proxy a) <> "]"
-instance (TypeShow a, TypeShow b) => TypeShow '(a,b)     where showType _ = "(" <> showType (Proxy :: Proxy a) <> ", " <> showType (Proxy :: Proxy b) <> ")"
+instance KnownNat n                                => TypeShow (n :: Nat) where showType = show $ natVal (Proxy :: Proxy n)
+instance (ListElemsShow a, Typeable a)             => TypeShow (a :: [k]) where showType = "[" <> showListElems @a <> "]"
+instance (TypeShow a, TypeShow b, Typeable '(a,b)) => TypeShow '(a,b)     where showType = "(" <> showType @a <> ", " <> showType @b <> ")"
 
 
 -- === List Helpers === --
 
-class                                                           ListElemsShow a         where showListElems :: Proxy a -> String
-instance {-# OVERLAPPABLE #-}                                   ListElemsShow '[]       where showListElems _ = ""
-instance {-# OVERLAPPABLE #-}  TypeShow a                    => ListElemsShow '[a]      where showListElems _ = showType (Proxy :: Proxy a)
-instance {-# OVERLAPPABLE #-} (TypeShow a, ListElemsShow as) => ListElemsShow (a ': as) where showListElems _ = showType (Proxy :: Proxy a) <> ", " <> showListElems (Proxy :: Proxy as)
-
+class                                                           ListElemsShow a         where showListElems :: String
+instance {-# OVERLAPPABLE #-}                                   ListElemsShow '[]       where showListElems = ""
+instance {-# OVERLAPPABLE #-}  TypeShow a                    => ListElemsShow '[a]      where showListElems = showType @a
+instance {-# OVERLAPPABLE #-} (TypeShow a, ListElemsShow as) => ListElemsShow (a ': as) where showListElems = showType @a <> ", " <> showListElems @as
diff --git a/src/Type/Show_old.hs b/src/Type/Show_old.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Show_old.hs
@@ -0,0 +1,64 @@
+{-# LANGUAGE ScopedTypeVariables  #-}
+{-# LANGUAGE PolyKinds            #-}
+{-# LANGUAGE ScopedTypeVariables  #-}
+{-# LANGUAGE AllowAmbiguousTypes  #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+module Type.Show_old where
+
+import Prelude
+import Data.Typeable
+import Data.Monoid
+import GHC.TypeLits
+import Text.Show.Pretty (ppValue, parseValue)
+import Text.PrettyPrint (Doc, text)
+import GHC.Exts         (Constraint)
+
+--showType :: Typeable a => a -> String
+--showType (a :: a) = showProxyType (Proxy :: Proxy a)
+
+--showProxyType :: Typeable (Proxy a) => Proxy a -> String
+--showProxyType = clear . drop 6 . show . typeOf where
+--    clear = \case ('(':s)     -> init  s
+--                  ('*':' ':s) -> clear s -- PolyKinded Proxies are shown as "Proxy *"
+--                  s           -> s
+
+
+class TypeShow a where
+    showType :: Proxy a -> String
+    default showType :: Typeable a => Proxy a -> String
+    showType = show . typeRep ; {-# INLINE showType #-}
+
+showType' :: forall t. TypeShow t => String
+showType' = showType (Proxy :: Proxy t) ; {-# INLINE showType' #-}
+
+printType :: TypeShow a => Proxy a -> IO ()
+printType = putStrLn . showType
+
+ppPrintType :: TypeShow a => Proxy a -> IO ()
+ppPrintType = putStrLn . ppShowType
+
+ppShowType :: TypeShow a => Proxy a -> String
+ppShowType = show . ppTypeDoc
+
+ppTypeDoc :: TypeShow a => Proxy a -> Doc
+ppTypeDoc a = case parseValue txt of
+            Just v  -> ppValue v
+            Nothing -> text txt
+  where txt = showType a
+
+
+
+-- === Basic Instances === --
+
+instance KnownNat n               => TypeShow (n :: Nat) where showType _ = show $ natVal (Proxy :: Proxy n)
+instance ListElemsShow a          => TypeShow (a :: [k]) where showType _ = "[" <> showListElems (Proxy :: Proxy a) <> "]"
+instance (TypeShow a, TypeShow b) => TypeShow '(a,b)     where showType _ = "(" <> showType (Proxy :: Proxy a) <> ", " <> showType (Proxy :: Proxy b) <> ")"
+
+
+-- === List Helpers === --
+
+class                                                           ListElemsShow a         where showListElems :: Proxy a -> String
+instance {-# OVERLAPPABLE #-}                                   ListElemsShow '[]       where showListElems _ = ""
+instance {-# OVERLAPPABLE #-}  TypeShow a                    => ListElemsShow '[a]      where showListElems _ = showType (Proxy :: Proxy a)
+instance {-# OVERLAPPABLE #-} (TypeShow a, ListElemsShow as) => ListElemsShow (a ': as) where showListElems _ = showType (Proxy :: Proxy a) <> ", " <> showListElems (Proxy :: Proxy as)
diff --git a/typelevel.cabal b/typelevel.cabal
--- a/typelevel.cabal
+++ b/typelevel.cabal
@@ -1,72 +1,69 @@
----------------------------------------------------
--- This is a generated cabal configuration file. --
--- DO NOT EDIT!                                  --
--- Use gencabal instead.                         --
----------------------------------------------------
-
-name:                typelevel
-version:             1.0.4
-synopsis:            Useful type level operations (type families and related operators).
--- description:         
-license:             Apache-2.0
-license-file:        LICENSE
-author:              Wojciech Danilo
-maintainer:          Wojciech Danilo <wojciech.danilo@gmail.com>
-stability:           experimental
-homepage:            https://github.com/wdanilo/typelevel
-bug-reports:         https://github.com/wdanilo/typelevel/issues
-copyright:           Copyright (C) 2014 Wojciech Danilo
-category:            Text
-build-type:          Simple
--- extra-source-files:  
-cabal-version:       >=1.10
-
-
-Library
-  hs-source-dirs:     src
-  ghc-options:        -Wall -O2
-  default-language:   Haskell2010
+-- This file has been generated from package.yaml by hpack version 0.20.0.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: 8c2af28df05f5ee1455810d87a4532bb30dad88e6db3246cd6a03a6602ecd5da
 
-  default-extensions: ConstraintKinds
-                      DataKinds
-                      DefaultSignatures
-                      DeriveDataTypeable
-                      DeriveFoldable
-                      DeriveFunctor
-                      DeriveGeneric
-                      DeriveTraversable
-                      DoAndIfThenElse
-                      EmptyDataDecls
-                      FlexibleContexts
-                      FlexibleInstances
-                      GeneralizedNewtypeDeriving
-                      InstanceSigs
-                      LambdaCase
-                      MultiParamTypeClasses
-                      OverloadedStrings
-                      StandaloneDeriving
-                      TemplateHaskell
-                      TupleSections
-                      TypeOperators
-                      ViewPatterns
-                      TypeFamilies
-  
-  Exposed-modules: 
-        Constraint.Container.Homo,
-        Type.Bool,
-        Type.Container,
-        Type.Either,
-        Type.List,
-        Type.Map,
-        Type.Maybe,
-        Type.Operators,
-        Type.Promotion,
-        Type.Sequence,
-        Type.Set,
-        Type.Show,
-        Type.Wrapped,
-        Type.Zip
+name:           typelevel
+version:        1.2.2
+synopsis:       Useful type level operations (type families and related operators).
+category:       Data
+stability:      experimental
+homepage:       https://github.com/luna/typelevel
+bug-reports:    https://github.com/luna/typelevel/issues
+author:         Luna Team
+maintainer:     Wojciech Danilo <wojciech.danilo@luna-lang.org>
+copyright:      Copyright (C) 2018 Luna Team
+license:        Apache-2.0
+license-file:   LICENSE
+build-type:     Simple
+cabal-version:  >= 1.10
 
-  build-depends:      base >=4.6 && <4.9
-                    , pretty-show
-                    , pretty
+library
+  hs-source-dirs:
+      src
+  default-extensions: AllowAmbiguousTypes ApplicativeDo BangPatterns BinaryLiterals ConstraintKinds DataKinds DefaultSignatures DeriveDataTypeable DeriveFoldable DeriveFunctor DeriveGeneric DeriveTraversable DoAndIfThenElse DuplicateRecordFields EmptyDataDecls FlexibleContexts FlexibleInstances FunctionalDependencies GADTs GeneralizedNewtypeDeriving InstanceSigs LambdaCase MonadComprehensions MultiWayIf NamedWildCards NegativeLiterals NumDecimals OverloadedLabels PackageImports QuasiQuotes PatternSynonyms RankNTypes RecursiveDo ScopedTypeVariables StandaloneDeriving TemplateHaskell TupleSections TypeApplications TypeFamilies TypeFamilyDependencies TypeOperators UnicodeSyntax ViewPatterns LiberalTypeSynonyms RelaxedPolyRec
+  ghc-options: -Wall -O2
+  build-depends:
+      base >=4.10 && <4.12
+    , constraints
+    , convert
+    , exceptions
+    , lens
+    , mtl
+    , pretty
+    , pretty-show
+    , primitive
+    , transformers
+  exposed-modules:
+      Constraint.Container.Homo
+      Data.Constraint.Struct
+      Data.Constraints
+      Data.Proxify
+      Type.Any
+      Type.Applicative
+      Type.Bool
+      Type.Container
+      Type.Either
+      Type.Error
+      Type.Error_old
+      Type.Functor
+      Type.Hidden
+      Type.Inference
+      Type.Known
+      Type.List
+      Type.Map
+      Type.Maybe
+      Type.Monoid
+      Type.Operators
+      Type.Promotion
+      Type.Relation
+      Type.Sequence
+      Type.Set
+      Type.Show
+      Type.Show_old
+      Type.Wrapped
+      Type.Zip
+  other-modules:
+      Paths_typelevel
+  default-language: Haskell2010
