



object wrap {

  trait DomainLike[@specialized(Int) A, +This <: Domain[A]]

  trait Domain[@specialized(Int) B]
  extends DomainLike[B, Domain[B]]

  trait IterableDomainLike[@specialized(Int) C, +This <: IterableDomain[C]]
  extends DomainLike[C, This]

  trait IterableDomain[@specialized(Int) D]
  extends Domain[D] with IterableDomainLike[D, IterableDomain[D]]

}
