"""
The client code should be able to work with any pre-configured abstraction-
implementation combination.
"""
from structural.bridge.abstractions import Abstraction
from structural.bridge.implementations import (
    ConcreteImplementationA,
    ConcreteImplementationB,
)


def client_code(abstraction: Abstraction) -> None:
    """
    Except for the initialization phase, where an Abstraction object gets
    linked with a specific Implementation object, the client code should only
    depend on the Abstraction class. This way the client code can support any
    abstraction-implementation combination.
    """

    print(abstraction.operation(), end="")


implementation = ConcreteImplementationA()
abstraction = Abstraction(implementation)

client_code(abstraction)

print("\n")

implementation = ConcreteImplementationB()
abstraction = Abstraction(implementation)

client_code(abstraction)
