diff --git a/README.md b/README.md index c9dafce..46bf02f 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,8 @@ let allPossibleBlueColorCombinations = Options.allContaining(.blue) / let favoriteColorCombo: Options = [.white, .blue, .red] let allPossibleFavoriteColorCombinations = Options.allContaining(favoriteColorCombo) // returns a list of all elements which contain `[.white, .blue, .red]`, sorted ascendingly by their raw values let sameAsAbove = favoriteColorCombo.allCombinationsContainingSelf + +let favoriteComboArray = favoriteColorCombo.decomposed // this is a [CardColor] array containing [.white, .blue, .red] ``` ## Limitations diff --git a/Sources/Options/Options.swift b/Sources/Options/Options.swift index 5d0458b..90f59e4 100644 --- a/Sources/Options/Options.swift +++ b/Sources/Options/Options.swift @@ -51,5 +51,10 @@ public struct Options: OptionSet { .map(Self.init(rawValue:)) .filter { $0.contains(option) } } + + /// Convenience method returning an array of all cases contained in `self`, ordered by their respective option's raw value. + public var decomposed: [EnumType] { + EnumType.allCases.filter { contains([$0]) } + } } diff --git a/Tests/OptionsTests/Options.swift b/Tests/OptionsTests/Options.swift index 72becdb..c2679cf 100644 --- a/Tests/OptionsTests/Options.swift +++ b/Tests/OptionsTests/Options.swift @@ -205,6 +205,28 @@ final class OptionsTests: XCTestCase { XCTAssertEqual(result2.sorted { $0.rawValue < $1.rawValue }, result2) XCTAssertEqual(result2, expect2) } + + func testDecompose() { + let option0: Options = [] + let option1: Options = [.blue] + let option2 = jeskai + let option3: Options = .all + + let expect0: [MagicColor] = [] + let expect1: [MagicColor] = [.blue] + let expect2: [MagicColor] = [.white, .blue, .red] + let expect3: [MagicColor] = [.white, .blue, .black, .red, .green] + + let result0 = option0.decomposed + let result1 = option1.decomposed + let result2 = option2.decomposed + let result3 = option3.decomposed + + XCTAssertEqual(result0, expect0) + XCTAssertEqual(result1, expect1) + XCTAssertEqual(result2, expect2) + XCTAssertEqual(result3, expect3) + } static var allTests = [ ("testNoValue", testNoValue), @@ -213,5 +235,6 @@ final class OptionsTests: XCTestCase { ("testAllValues", testAllValues), ("testUnion", testUnion), ("testContains", testContains), + ("testAllOptionsContainingOption", testAllOptionsContainingOption), ] }