blob: 5400d45cdf756d2aab314c6e39ecf4be5e0dd7e0 [file] [log] [blame]
//
// MTLValueTransformer.m
// Mantle
//
// Created by Justin Spahr-Summers on 2012-09-11.
// Copyright (c) 2012 GitHub. All rights reserved.
//
#import "MTLValueTransformer.h"
//
// Any MTLValueTransformer supporting reverse transformation. Necessary because
// +allowsReverseTransformation is a class method.
//
@interface MTLReversibleValueTransformer : MTLValueTransformer
@end
@interface MTLValueTransformer ()
@property (nonatomic, copy, readonly) MTLValueTransformerBlock forwardBlock;
@property (nonatomic, copy, readonly) MTLValueTransformerBlock reverseBlock;
@end
@implementation MTLValueTransformer
#pragma mark Lifecycle
+ (instancetype)transformerWithBlock:(MTLValueTransformerBlock)transformationBlock {
return [[self alloc] initWithForwardBlock:transformationBlock reverseBlock:nil];
}
+ (instancetype)reversibleTransformerWithBlock:(MTLValueTransformerBlock)transformationBlock {
return [self reversibleTransformerWithForwardBlock:transformationBlock reverseBlock:transformationBlock];
}
+ (instancetype)reversibleTransformerWithForwardBlock:(MTLValueTransformerBlock)forwardBlock reverseBlock:(MTLValueTransformerBlock)reverseBlock {
return [[MTLReversibleValueTransformer alloc] initWithForwardBlock:forwardBlock reverseBlock:reverseBlock];
}
- (id)initWithForwardBlock:(MTLValueTransformerBlock)forwardBlock reverseBlock:(MTLValueTransformerBlock)reverseBlock {
NSParameterAssert(forwardBlock != nil);
self = [super init];
if (self == nil) return nil;
_forwardBlock = [forwardBlock copy];
_reverseBlock = [reverseBlock copy];
return self;
}
#pragma mark NSValueTransformer
+ (BOOL)allowsReverseTransformation {
return NO;
}
+ (Class)transformedValueClass {
return [NSObject class];
}
- (id)transformedValue:(id)value {
return self.forwardBlock(value);
}
@end
@implementation MTLReversibleValueTransformer
#pragma mark Lifecycle
- (id)initWithForwardBlock:(MTLValueTransformerBlock)forwardBlock reverseBlock:(MTLValueTransformerBlock)reverseBlock {
NSParameterAssert(reverseBlock != nil);
return [super initWithForwardBlock:forwardBlock reverseBlock:reverseBlock];
}
#pragma mark NSValueTransformer
+ (BOOL)allowsReverseTransformation {
return YES;
}
- (id)reverseTransformedValue:(id)value {
return self.reverseBlock(value);
}
@end