//
// FLEXCollectionContentSection.h
// FLEX
//
// Created by Tanner Bennett on 8/28/19.
// Copyright © 2020 FLEX Team. All rights reserved.
//
#import "FLEXTableViewSection.h"
#import "FLEXObjectInfoSection.h"
@class FLEXCollectionContentSection, FLEXTableViewCell;
@protocol FLEXCollection, FLEXMutableCollection;
/// Any foundation collection implicitly conforms to FLEXCollection.
/// This future should return one. We don't explicitly put FLEXCollection
/// here because making generic collections conform to FLEXCollection breaks
/// compile-time features of generic arrays, such as \c someArray[0].property
typedef id(^FLEXCollectionContentFuture)(__kindof FLEXCollectionContentSection *section);
#pragma mark Collection
/// A protocol that enables \c FLEXCollectionContentSection to operate on any arbitrary collection.
/// \c NSArray, \c NSDictionary, \c NSSet, and \c NSOrderedSet all conform to this protocol.
@protocol FLEXCollection
@property (nonatomic, readonly) NSUInteger count;
- (id)copy;
- (id)mutableCopy;
@optional
/// Unordered, unkeyed collections must implement this
@property (nonatomic, readonly) NSArray *allObjects;
/// Keyed collections must implement this and \c objectForKeyedSubscript:
@property (nonatomic, readonly) NSArray *allKeys;
/// Ordered, indexed collections must implement this.
- (id)objectAtIndexedSubscript:(NSUInteger)idx;
/// Keyed, unordered collections must implement this and \c allKeys
- (id)objectForKeyedSubscript:(id)idx;
@end
@protocol FLEXMutableCollection
- (void)filterUsingPredicate:(NSPredicate *)predicate;
@end
#pragma mark - FLEXCollectionContentSection
/// A custom section for viewing collection elements.
///
/// Tapping on a row pushes an object explorer for that element.
@interface FLEXCollectionContentSection<__covariant ObjectType> : FLEXTableViewSection {
@protected
/// Unused if initialized with a future
id _collection;
/// Unused if initialized with a collection
FLEXCollectionContentFuture _collectionFuture;
/// The filtered collection from \c _collection or \c _collectionFuture
id _cachedCollection;
}
+ (instancetype)forCollection:(id)collection;
/// The future given should be safe to call more than once.
/// The result of calling this future multiple times may yield
/// different results each time if the data is changing by nature.
+ (instancetype)forReusableFuture:(FLEXCollectionContentFuture)collectionFuture;
/// Defaults to \c NO
@property (nonatomic) BOOL hideSectionTitle;
/// Defaults to \c nil
@property (nonatomic, copy) NSString *customTitle;
/// Defaults to \c NO
///
/// Settings this to \c NO will not display the element index for ordered collections.
/// This property only applies to \c NSArray or \c NSOrderedSet and their subclasses.
@property (nonatomic) BOOL hideOrderIndexes;
/// Set this property to provide a custom filter matcher.
///
/// By default, the collection will filter on the title and subtitle of the row.
/// So if you don't ever call \c configureCell: for example, you will need to set
/// this property so that your filter logic will match how you're setting up the cell.
@property (nonatomic) BOOL (^customFilter)(NSString *filterText, ObjectType element);
/// Get the object in the collection associated with the given row.
/// For dictionaries, this returns the value, not the key.
- (ObjectType)objectForRow:(NSInteger)row;
/// Subclasses may override.
- (UITableViewCellAccessoryType)accessoryTypeForRow:(NSInteger)row;
@end