     }
 }
 
+// MARK: - Helper: Loop through enum values
+
+// Based on: https://stackoverflow.com/a/35741424
+protocol InfiniteIteration {
+    static var first: Self { get }
+}
+
+extension InfiniteIteration where Self: RawRepresentable, Self.RawValue == Int {
+    var nextValue: Self {
+        return Self(rawValue: rawValue + 1) ?? Self.first
+    }
+}
+
 // MARK: - Helper: Create attributed string with different format
 
 /// Based on: https://stackoverflow.com/a/37992022

        }
    }

    enum TimingFunctionList: Int {
        case `default`
        case easeInCubic
        case easeInBack

        static let first: TimingFunctionList = .`default`

        var nextValue: TimingFunctionList {
            let enumType = type(of: self)
            return enumType.init(rawValue: rawValue + 1) ?? enumType.first
        }

        var asTimingFunction: CAMediaTimingFunction? {
            switch self {


    // MARK: - Types

    enum GradientColorSchemeList: Int, InfiniteIteration {
        case `default`
        case pinkFlamingo

        static let first: GradientColorSchemeList = .`default`

        var asColorList: [UIColor]? {
            switch self {
