https://github.com/ukushu/Ifrit.git
git@github.com:ukushu/Ifrit.git
Ifrit is a super lightweight library which provides a simple way to do fuzzy searching.
This repository is based on archived repository Fuze-Swift by KRisk ( https://github.com/krisk/fuse-swift)
+ Fuze-Swift support Pods and Packages :)
- Ifrit supports only Packages :(
- Fuze-Swift is dead :(
+ Ifrit is live :)
- Fuze-Swift have multithreading issues - crashes is possible :(
+ Ifrit is a Fuze-Swift with fixed multithreading issues - no crashes :)
- Fuze-Swift written for xcode 11 and have a lot of warnings at now :(
+ Ifrit code is updated to swift's latest standards and there are no build warnings :)
- Fuze-Swift supports async functins with callbacks, but does not support async/await
+ Ifrit supports callbacks and async/await both:)
- Fuze-Swift async functions returns incorrect results (wrong indexes) :((((
+ Ifrit's async functins returns correct indexes and covered with tests :)
+ Ifrit have refactored code and extended tests coverage :)let fuse = Fuse()
let result = fuse.searchSync("od mn war", in: "Old Man's War")
print(result?.score) // 0.44444444444444442 // LOWEST SCORE = BETTER
print(result?.ranges) // [CountableClosedRange(0...0), CountableClosedRange(2...6), CountableClosedRange(9...12)]let books = ["The Silmarillion", "The Lock Artist", "The Lost Symbol"]
let fuse = Fuse()
let results = fuse.searchSync("Te silm", in: books)
results.forEach { item in
print("index: " + item.index)
print("score: " + item.score)
print("ranges: " + item.ranges)
}let results = await fuse.search("Te silm", in: books)
results.forEach { item in
print("index: " + item.index)
print("score: " + item.score)
print("ranges: " + item.ranges)
}fuse.search("Te silm", in: books, completion: { results in
results.forEach { item in
print("index: " + item.index)
print("score: " + item.score)
print("ranges: " + item.ranges)
}
})struct Book: Fuseable {
let title: String
let author: String
var properties: [FuseProp] {
return [
FuseProp(title, weight: 0.3),
FuseProp(author, weight: 0.7)
]
}
//Or this like:
//var properties: [FuseProp] {
// return [title, author].map{ FuseProp($0) }
//}
//
}
let books: [Book] = [
Book(author: "John X", title: "Old Man's War fiction"),
Book(author: "P.D. Mans", title: "Right Ho Jeeves")
]
let fuse = Fuse()
let results = fuse.searchSync("man", in: books)
results.forEach { item in
print("index: " + item.index)
print("score: " + item.score)
print("results: " + item.results)
print("---------------")
}
// Output:
//
// index: 1
// score: 0.015000000000000003
// results: [(value: "P.D. Mans", score: 0.015000000000000003, ranges: [CountableClosedRange(5...7)])]
// ---------------
// index: 0
// score: 0.027999999999999997
// results: [(value: "Old Man\'s War fiction", score: 0.027999999999999997, ranges: [CountableClosedRange(4...6)])]let results = await fuse.search("Man", in: books)
results.forEach { item in
print("index: " + item.index)
print("score: " + item.score)
print("results: " + item.results)
print("---------------")
}
fuse.search("Man", in: books, completion: { results in
results.forEach { item in
print("index: " + item.index)
print("score: " + item.score)
print("results: " + item.results)
print("---------------")
}
})Fuse takes the following options:
location: Approximately where in the text is the pattern expected to be found. Defaults to0distance: Determines how close the match must be to the fuzzylocation(specified above). An exact letter match which isdistancecharacters away from the fuzzy location would score as a complete mismatch. A distance of0requires the match be at the exactlocationspecified, adistanceof1000would require a perfect match to be within800characters of the fuzzy location to be found using a0.8threshold. Defaults to100threshold: At what point does the match algorithm give up. A threshold of0.0requires a perfect match (of both letters and location), a threshold of1.0would match anything. Defaults to0.6maxPatternLength: The maximum valid pattern length. The longer the pattern, the more intensive the search operation will be. If the pattern exceeds themaxPatternLength, thesearchoperation will returnnil. Why is this important? Read this. Defaults to32isCaseSensitive: Indicates whether comparisons should be case sensitive. Defaults tofalse
!!!!!!!!!!! Ifrit repository have no example project. !!!!!!!!!!!
As example project you can use project from original Fuse-Swift repository To run the example project:
- clone the Fuse-Swift( https://github.com/krisk/fuse-swift.git ) repo
- and run
pod installfrom the Example directory first.
-
XCode -> Menu Line -> Add Package Dependencies ->
https://github.com/ukushu/Ifrit.git -
import Ifritto your source files.
