internal static ChainedProjection <TOutItem, TInItem, TMiddleItem, SingleProjection <TOutItem, TMiddleItem>, TProjection> Bridge <TOutItem, TInItem, TMiddleItem, TProjection>(ref TProjection left, Func <TMiddleItem, TOutItem> right, string rightName)
            where TProjection : struct, IStructProjection <TMiddleItem, TInItem>
        {
            if (right == null)
            {
                throw CommonImplementation.ArgumentNull(rightName);
            }
            var rightBridge = new SingleProjection <TOutItem, TMiddleItem>(right);

            return(new ChainedProjection <TOutItem, TInItem, TMiddleItem, SingleProjection <TOutItem, TMiddleItem>, TProjection>(ref left, ref rightBridge));
        }
        internal static ChainedProjection <TOutItem, TInItem, TMiddleItem, SingleProjection <TOutItem, TMiddleItem>, SingleProjection <TMiddleItem, TInItem> > Bridge <TOutItem, TInItem, TMiddleItem>(Func <TInItem, TMiddleItem> left, Func <TMiddleItem, TOutItem> right, string rightName)
        {
            if (right == null)
            {
                throw CommonImplementation.ArgumentNull(rightName);
            }

            var leftBridge  = new SingleProjection <TMiddleItem, TInItem>(left);
            var rightBridge = new SingleProjection <TOutItem, TMiddleItem>(right);

            return(new ChainedProjection <TOutItem, TInItem, TMiddleItem, SingleProjection <TOutItem, TMiddleItem>, SingleProjection <TMiddleItem, TInItem> >(ref leftBridge, ref rightBridge));
        }