//
//  MPRootTerm.m
//  MathPad
//
//  Created by Kim Wittenburg on 11.01.15.
//  Copyright (c) 2015 Kim Wittenburg. All rights reserved.
//

#import "MPRootTerm.h"

#import "MPParsedExpression.h"



@implementation MPRootTerm

- (NSDecimalNumber *)doEvaluation:(NSError *__autoreleasing *)error
{
    MPEvaluateExpression(exponent, 0);
    MPEvaluateExpression(root, 1);
    if ([root compare:[NSDecimalNumber zero]] < 0) {
        // There are no negative roots.
        if (error) {
            *error = [NSError errorWithDomain:MPMathKitErrorDomain
                                         code:101
                                     userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"The root of a negative number is undefined.", nil)}];
        }
        return nil;
    }
    if ([exponent isEqualToNumber:@(0)]) {
        // The C pow function returns 1 for pow(0, 0). Mathematically this should be undefined.
        if (error) {
            *error = [NSError errorWithDomain:MPMathKitErrorDomain
                                         code:101
                                     userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"The 0th root is undefined.", nil)}];
        }
        return nil;
    }
    NSDecimalNumber *actualExponent = [[NSDecimalNumber one] decimalNumberByDividingBy:exponent];
    return [[NSDecimalNumber alloc] initWithDouble:pow(root.doubleValue, actualExponent.doubleValue)];

}

@end
