class BindingInitializer<T> {

    private final Set<Key<?>> dependencies;

    protected BindingInitializer(Set<Key<?>> dependencies) {
        this.dependencies = dependencies;
    }

    public Set<Key<?>> getDependencies() {
        return dependencies;
    }

    public abstract Consumer<T> compile(Function<Key<?>, Supplier<?>> compiler);

    public static <T> BindingInitializer<T> combine(List<BindingInitializer<T>> bindingInitializers) {<FILL_FUNCTION_BODY>}
}

        Set<Key<?>> deps = bindingInitializers.stream()
                .map(BindingInitializer::getDependencies)
                .flatMap(Collection::stream)
                .collect(toSet());
        return new BindingInitializer<T>(deps) {
            @Override
            public Consumer<T> compile(Function<Key<?>, Supplier<?>> compiler) {
                return instance -> bindingInitializers.stream()
                        .map(bindingInitializer -> bindingInitializer.compile(compiler))
                        .forEach(i -> i.accept(instance));
            }
        };
    
<no_super_class>