Associated types are a powerful way of making protocols generic. Generic enables you to write flexible, reusable functions and types that can work with any type, subject to requirements that you define.
S → Single-responsiblity principle O → Open-closed principle L → Liskov substitution principle I → Interface segregation principle D → Dependency Inversion Principle