// // MPTerm.m // MathPad // // Created by Kim Wittenburg on 27.09.14. // Copyright (c) 2014 Kim Wittenburg. All rights reserved. // #import "MPTerm.h" #import "MPEvaluationContext.h" @interface MPTerm () @property (nonatomic, copy) NSDecimalNumber *(^block)(); @end @implementation MPTerm - (instancetype)initWithBlock:(NSDecimalNumber *(^)())block { self = [super init]; if (self) { self.block = block; } return self; } - (instancetype)initWithNumber:(NSDecimalNumber *)number { return [self initWithBlock:^NSDecimalNumber *{ return number; }]; } - (instancetype)initWithSummands:(NSArray *)summands { return [self initWithBlock:^NSDecimalNumber *{ NSDecimalNumber *value = [NSDecimalNumber zero]; for (MPTerm *term in summands) { value = [value decimalNumberByAdding:[term evaluate]]; } return value; }]; } - (instancetype)initWithFactors:(NSArray *)factors { return [self initWithBlock:^NSDecimalNumber *{ NSDecimalNumber *value = [NSDecimalNumber one]; for (MPTerm *term in factors) { value = [value decimalNumberByMultiplyingBy:[term evaluate]]; } return value; }]; } - (instancetype)initWithVariable:(NSString *)variable { return [self initWithBlock:^NSDecimalNumber *{ return [[MPEvaluationContext sharedContext] valueForVariable:variable]; }]; } - (instancetype)initWithFactorialOfTerm:(MPTerm *)term { return [self initWithBlock:^NSDecimalNumber *{ NSDecimalNumber *termValue = [term evaluate]; NSLog(@"Factorial of %@ = %f", termValue, tgamma(termValue.doubleValue + 1)); return [[NSDecimalNumber alloc] initWithDouble:tgamma(termValue.doubleValue + 1)]; }]; } - (instancetype)initWithSinOfTerm:(MPTerm *)term { return [self initWithBlock:^NSDecimalNumber *{ NSDecimalNumber *termValue = [term evaluate]; return [[NSDecimalNumber alloc] initWithDouble:sin(termValue.doubleValue)]; }]; } - (instancetype)initWithCosOfTerm:(MPTerm *)term { return [self initWithBlock:^NSDecimalNumber *{ NSDecimalNumber *termValue = [term evaluate]; return [[NSDecimalNumber alloc] initWithDouble:cos(termValue.doubleValue)]; }]; } - (instancetype)initWithTanOfTerm:(MPTerm *)term { return [self initWithBlock:^NSDecimalNumber *{ NSDecimalNumber *termValue = [term evaluate]; return [[NSDecimalNumber alloc] initWithDouble:tan(termValue.doubleValue)]; }]; } - (NSDecimalNumber *)evaluate { return self.block(); } @end