Да, собственно, что я пытаюсь решить. Этот набор кейс классов используется в разных методах, но ни один из методов не возвращает/принимает полный набор, каждый только часть. Где-то условно только Foo и Bar, где-то Foo и Qoo. Хотелось это ограничение выразить в типах. Первое что пришло в голову это завести трейтов по количеству комбинация и кейс классы унаследовать от них. но мне эта идея не нравится, так как эти трейты они инородны данным получаются. Что нравится чуть больше - это сделать несколько sealed trait и унаследовать от них классы контейнеры - но тогда руками писать много однотипного кода. Вот и пытаюсь придумать что-нибудь получше. А может и зря пытаюсь. :)
есть ещё один паттерн через with, но вам придется переворачивать копродукт в продукт и на оборот. т.е. вам нужно сделать trait CouldBeFoo{ def hasFoo: Option[Foo]}, trait CouldBeBar{ def hasBar: Option[Bar]}, trait CouldBeBaz{ def hasBaz: Option[Baz]}, тогда можно в CouldBeFoo with CouldBeBar with CouldBeBaz, но это уже переделка копродукта. Но вообще, шарить ответы между сервисами это идея которая производит некоторые проблемы, в частности вот эту.