forked from torifat/iAvro
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Suggestion.m
90 lines (74 loc) · 2.37 KB
/
Suggestion.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//
// AvroKeyboard
//
// Created by Rifat Nabi on 6/28/12.
// Copyright (c) 2012 OmicronLab. All rights reserved.
//
#import "Suggestion.h"
#import "AvroParser.h"
#import "AutoCorrect.h"
#import "RegexParser.h"
#import "Database.h"
#import "NSString+Levenshtein.h"
@implementation Suggestion
- (id)init {
self = [super init];
if (self) {
[AvroParser allocateSharedInstance];
[AutoCorrect allocateSharedInstance];
[Database allocateSharedInstance];
_suggestions = [[NSMutableArray alloc] initWithCapacity:0];
}
return self;
}
- (void)dealloc {
[super dealloc];
}
static Suggestion* sharedInstance = nil;
+ (void)allocateSharedInstance {
sharedInstance = [[self alloc] init];
}
+ (void)deallocateSharedInstance {
[AvroParser deallocateSharedInstance];
[AutoCorrect deallocateSharedInstance];
[Database deallocateSharedInstance];
[sharedInstance release];
}
+ (Suggestion *)sharedInstance {
return sharedInstance;
}
- (NSMutableArray*)getList:(NSString*)term {
// Suggestion form AutoCorrect
NSString* autoCorrect = [[AutoCorrect sharedInstance] find:term];
if (autoCorrect) {
[_suggestions addObject:autoCorrect];
}
// Suggestion from Dictionary
NSArray* dicList = [[Database sharedInstance] find:term];
// Suggestion from Default Parser
NSString* paresedString = [[AvroParser sharedInstance] parse:term];
if (dicList) {
// Sort dicList based on edit distance
NSArray* sortedDicList = [dicList sortedArrayUsingComparator:^NSComparisonResult(id left, id right) {
int dist1 = [paresedString computeLevenshteinDistanceWithString:(NSString*)left];
int dist2 = [paresedString computeLevenshteinDistanceWithString:(NSString*)right];
if (dist1 < dist2) {
return NSOrderedAscending;
}
else if (dist1 > dist2) {
return NSOrderedDescending;
} else {
return NSOrderedSame;
}
}];
[_suggestions addObjectsFromArray:sortedDicList];
if (autoCorrect && [dicList containsObject:autoCorrect]) {
[_suggestions removeObjectIdenticalTo:autoCorrect];
}
}
if ([_suggestions containsObject:paresedString] == NO) {
[_suggestions addObject:paresedString];
}
return _suggestions;
}
@end