ruleSetOcti s = case break (== ':') s of
    (major, ':':minors) -> liftM  (flip OctiRuleSet (minorVariations minors       )) (majorVariation major        )
    (majorOrMinors, "") -> liftM  (flip OctiRuleSet (Set.empty                    )) (majorVariation majorOrMinors)
                   `mplus` return (OctiRuleSet Full (minorVariations majorOrMinors))
    where
    majorVariation      = ruleSetLookup [("full", Full), ("fast", Fast), ("kids", Kids)]
    minorVariation    s = fromMaybe (OtherMinorVariation s) . ruleSetLookup [("edgeless", Edgeless), ("superprong", Superprong)] $ s
    minorVariations     = Set.fromList . map minorVariation . splitWhen (== ',')
ruleSetOcti s = case break (== ':') s of
    (major, ':':minors) -> liftM  (flip OctiRuleSet (minorVariations minors       )) (majorVariation major        )
    (majorOrMinors, "") -> liftM  (flip OctiRuleSet (Set.empty                    )) (majorVariation majorOrMinors)
                   `mplus` return (OctiRuleSet Full (minorVariations majorOrMinors))
    where
    majorVariation      = ruleSetLookup [("full", Full), ("fast", Fast), ("kids", Kids)]
    minorVariation    s = fromMaybe (OtherMinorVariation s) . ruleSetLookup [("edgeless", Edgeless), ("superprong", Superprong)] $ s
    minorVariations     = Set.fromList . map minorVariation . splitWhen (== ',')
ruleSetOcti s = case break (== ':') s of
    (major, ':':minors) -> liftM  (flip OctiRuleSet (minorVariations minors       )) (majorVariation major        )
    (majorOrMinors, "") -> liftM  (flip OctiRuleSet (Set.empty                    )) (majorVariation majorOrMinors)
                   `mplus` return (OctiRuleSet Full (minorVariations majorOrMinors))
    where
    majorVariation      = ruleSetLookup [("full", Full), ("fast", Fast), ("kids", Kids)]
    minorVariation    s = fromMaybe (OtherMinorVariation s) . ruleSetLookup [("edgeless", Edgeless), ("superprong", Superprong)] $ s
    minorVariations     = Set.fromList . map minorVariation . splitWhen (== ',')