[<RequireQualifiedAccess>]
open Microsoft.FSharp.Reflection
let private bindingFlags = BindingFlags.Public ||| BindingFlags.NonPublic
let getAll<'a when 'a : comparison> () : Set<'a> =
FSharpType.GetUnionCases(typeof<'a>, bindingFlags)
|> Seq.map (fun unionCaseInfo -> FSharpValue.MakeUnion(unionCaseInfo, [||], bindingFlags) :?> 'a)
| :? TargetParameterCountException -> raise <| ArgumentException "Union type must contain only cases without fields."
let allFlags : Set<Flags> = (UnionEnum.getAll<Flags> : unit -> Set<Flags>) () : Set<Flags>
let flagsA : Set<Flags> = (set : List<Flags> -> Set<Flags>) ([ (FlagA : Flags) ] : Flags list) : Set<Flags>
let flagsBC : Set<Flags> = (allFlags : Set<Flags>) - (flagsA : Set<Flags>) : Set<Flags>