import Foundation
import UIKit
import AsyncDisplayKit

public protocol GridSection {
    var height: CGFloat { get }
    var hashValue: Int { get }
    
    func isEqual(to: GridSection) -> Bool
    func node() -> ASDisplayNode
}

public protocol GridItem {
    var section: GridSection? { get }
    func node(layout: GridNodeLayout, synchronousLoad: Bool) -> GridItemNode
    func update(node: GridItemNode)
    var aspectRatio: CGFloat { get }
    var fillsRowWithHeight: (CGFloat, Bool)? { get }
    var fillsRowWithDynamicHeight: ((CGFloat) -> CGFloat)? { get }
    var customItemSize: CGSize? { get }
}

public extension GridItem {
    var aspectRatio: CGFloat {
        return 1.0
    }
    
    var fillsRowWithHeight: (CGFloat, Bool)? {
        return nil
    }
    
    var fillsRowWithDynamicHeight: ((CGFloat) -> CGFloat)? {
        return nil
    }
    
    var customItemSize: CGSize? {
        return nil
    }
}