 import UIKit
 
-final class CollectionReusableViewSizer<View: UICollectionReusableView & ReusableViewModelView> {
+public final class CollectionReusableViewSizer<View: UICollectionReusableView & ReusableViewModelView> {
 
-    typealias ViewModel = View.ViewModel
+    public typealias ViewModel = View.ViewModel
 
-    enum Dimension: Hashable {
+    public enum Dimension: Hashable {
 
         case compressed
         case expanded

    }
}

struct ConstantSizerCacheKey: Hashable {}

protocol SizerViewModelView: ReusableViewModelView {

    associatedtype SizerCacheKey: Hashable = ConstantSizerCacheKey

    static func sizerCacheKeyFor(viewModel: ViewModel) -> SizerCacheKey
}

extension SizerViewModelView where SizerCacheKey == ConstantSizerCacheKey {

    static func sizerCacheKeyFor(viewModel: ViewModel) -> SizerCacheKey { return SizerCacheKey() }
}

final class CollectionReusableViewSizerCache<View: UICollectionReusableView & SizerViewModelView> {

    typealias Sizer = CollectionReusableViewSizer<View>

    private struct Key: Hashable {
        let key: View.SizerCacheKey


    private lazy var view = View()

    public init() {}

    public func sizeFor(
        viewModel: ViewModel,
        width: Dimension = .compressed,
        height: Dimension = .compressed,
