using streams is cleaner here
simplify
make a couple more traits sealed