trait Iterable[T] {
  def map[A](f: T => A): Iterable[A]
  def filter(p: T => Boolean): Iterable[T]
  def remove(p: T => Boolean): Iterable[T] =
    filter(x => !p(x))
}

// copy-pasting required
trait List[T] extends Iterable[T] {
  def map[A](f: T => A): Iterable[A]
  def filter(p: T => Boolean): List[T]
  def remove(p: T => Boolean): List[T] =
    filter(x => !p(x))
}

// U is the type of a generic container
trait Iterable[T, U[x]] {
  def map[A](f: T => A): U[A]
  def def filter(p: T => Boolean): U[T]
  def remove(p: T => Boolean): U[T] =
    filter(x => !p(x))
}

// List is the type of the container
trait List[T] extends Iterable[T, List]
