why doe we need the `filter(_ <:< tp)`?