public static bool TestFirstCommutativity()
        {
            var f  = new Func <int, int>(x => x + 1);
            var g  = new Func <int, int>(y => y - 1);
            var id = new Func <int, int>(x => x);

            var firstArrow = Op.Arr((int x) => x * 7, (int y) => y / 7).First(default(int));
            var fgArrow    = id.Mult(f).Arr(id.Mult(g));

            var firstArrowFirst = firstArrow.Combine(fgArrow);
            var firstArrowLast  = fgArrow.Combine(firstArrow);

            return(ArrowTestUtils.AssertPairInvertibleArrowsGiveSameOutput(firstArrowFirst, firstArrowLast));
        }
        public static bool TestFirstDistributivity()
        {
            var f  = new Func <int, int>(x => x * 3 - 2);
            var g  = new Func <int, int>(y => (y + 2) / 3);
            var id = new Func <int, int>(x => x);

            var unDistributed = f.Arr(g).First(default(int));

            var distributed = (f.Mult(id)).Arr(g.Mult(id));

            return(ArrowTestUtils.AssertPairInvertibleArrowsGiveSameOutput(distributed, unDistributed));
        }
        public static bool TestFirstDistributivity()
        {
            var f = new Func<int, int>(x => x * 3 - 2);
            var g = new Func<int, int>(y => (y + 2) / 3);
            var id = new Func<int, int>(x => x);

            var unDistributed = f.Arr(g).First(default(int));

            var distributed = (f.Mult(id)).Arr(g.Mult(id));

            return ArrowTestUtils.AssertPairInvertibleArrowsGiveSameOutput(distributed, unDistributed);
        }
        public static bool TestFirstCommutativity()
        {
            var f = new Func<int, int>(x => x + 1);
            var g = new Func<int, int>(y => y - 1);
            var id = new Func<int, int>(x => x);

            var firstArrow = Op.Arr((int x) => x * 7, (int y) => y / 7).First(default(int));
            var fgArrow = id.Mult(f).Arr(id.Mult(g));

            var firstArrowFirst = firstArrow.Combine(fgArrow);
            var firstArrowLast = fgArrow.Combine(firstArrow);

            return ArrowTestUtils.AssertPairInvertibleArrowsGiveSameOutput(firstArrowFirst, firstArrowLast);
        }