package main type Point struct { X float64 Y float64 } type Line struct { P0 Point P1 Point } type QuadBez struct { P0 Point P1 Point P2 Point } type PathSegmentKind int const ( LineKind PathSegmentKind = iota + 1 QuadKind ) type PathSegment struct { Kind PathSegmentKind P0 Point P1 Point P2 Point P3 Point } func AsPathSegment[T Line | QuadBez](seg T) PathSegment { switch seg := any(seg).(type) { case Line: return PathSegment{Kind: LineKind, P0: seg.P0, P1: seg.P1} case QuadBez: return PathSegment{Kind: QuadKind, P0: seg.P0, P1: seg.P1, P2: seg.P2} default: panic("unreachable") } } var Sink PathSegment func main() { Sink = AsPathSegment(Line{Point{2, 3}, Point{4, 5}}) }