public static async Task<CubeRotation> PositionOnBottom(CubeConfiguration<FaceColour> config, FaceType face)
        {
            CubeRotation cubeRotation;

            switch (face)
            {
                case FaceType.Down:
                    return null;

                case FaceType.Upper:
                    cubeRotation = CubeRotations.X2;
                    break;

                case FaceType.Right:
                    cubeRotation = CubeRotations.ZClockwise;
                    break;

                case FaceType.Left:
                    cubeRotation = CubeRotations.ZAntiClockwise;
                    break;

                case FaceType.Front:
                    cubeRotation = CubeRotations.XAntiClockwise;
                    break;

                case FaceType.Back:
                    cubeRotation = CubeRotations.XClockwise;
                    break;

                default:
                    throw new Exception("Unknown face");
            }

            await config.RotateCube(cubeRotation).ConfigureAwait(false);
            return cubeRotation;
        }
        public static async Task<CubeRotation> PositionOnFront(CubeConfiguration<FaceColour> config, FaceColour faceColour)
        {
            var face = FindFaceWithCentreColour(config, faceColour);
            CubeRotation cubeRotation;

            switch (face)
            {
                case FaceType.Front:
                    return null;

                case FaceType.Upper:
                    cubeRotation = CubeRotations.XAntiClockwise;
                    break;

                case FaceType.Right:
                    cubeRotation = CubeRotations.YClockwise;
                    break;

                case FaceType.Left:
                    cubeRotation = CubeRotations.YAntiClockwise;
                    break;

                case FaceType.Down:
                    cubeRotation = CubeRotations.XClockwise;
                    break;

                case FaceType.Back:
                    cubeRotation = CubeRotations.Y2;
                    break;

                default:
                    throw new Exception("Unknown face");
            }

            await config.RotateCube(cubeRotation).ConfigureAwait(false);
            return cubeRotation;
        }
        public static void ApplyRotations(IEnumerable<IRotation> rotations, CubeConfiguration<FaceColour> configuration)
        {
            foreach (var rotation in rotations)
            {
                var cubeRotation = rotation as CubeRotation;
                var faceRotation = rotation as FaceRotation;

                if (cubeRotation != null)
                {
                    configuration.RotateCube(cubeRotation).Wait();
                }
                if (faceRotation != null)
                {
                    configuration.Rotate(faceRotation).Wait();
                }
            }
        }