improved discriminated union