# Usage Examples
## Search Bar
Demo made using [iced-rs](https://github.com/iced-rs/iced).
You can run this example locally by running
```shell
cargo run --package search_bar
```
#### Simple search
Simple search.
```shell
cargo run --example simple-search
```
```rust
let fuse = Fuse::default();
let text = "Old Man's War";
let search_text = "od mn war";
let result = fuse.search_text_in_string(search_text, text);
assert_eq!(result, Some(ScoreResult{
score: 0.4444444444444444,
ranges: vec!((0..1), (2..7), (9..13)),
}), "Simple search returned incorrect results");
```
#### Iterable search
Search over a string iterable.
```shell
cargo run --example iterable-search
```
```rust
let fuse = Fuse::default();
let books = [
"The Silmarillion",
"The Lock Artist",
"The Lost Symbol"
];
// Improve performance by creating the pattern before hand.
let search_pattern = fuse.create_pattern("Te silm");
let results = fuse.search_text_in_iterable("Te silm", books.iter());
assert_eq!(results, vec!(
SearchResult{
index: 0,
score: 0.14285714285714285,
ranges: vec!((0..1), (2..8), (10..14)),
},
SearchResult{
index: 2,
score: 0.49857142857142855,
ranges: vec!((0..1), (2..5), (6..10), (11..12), (14..15)),
},
SearchResult{
index: 1,
score: 0.5714285714285714,
ranges: vec!((0..1), (2..5), (8..9), (11..15)),
},
), "Iterable search returned incorrect results");
```
#### Fuseable search
Search over a list of items implementing the Fuseable trait.
```shell
cargo run --example fuseable-search
```
```rust
struct Book<'a> {
title: &'a str,
author: &'a str,
}
impl Fuseable for Book<'_>{
fn properties(&self) -> Vec {
return vec!(
FuseProperty{value: String::from("title"), weight: 0.3},
FuseProperty{value: String::from("author"), weight: 0.7},
)
}
fn lookup(&self, key: &str) -> Option<&str> {
return match key {
"title" => Some(self.title),
"author" => Some(self.author),
_ => None
}
}
}
fn main() {
let books = [
Book{author: "John X", title: "Old Man's War fiction"},
Book{author: "P.D. Mans", title: "Right Ho Jeeves"},
];
let fuse = Fuse::default();
let results = fuse.search_text_in_fuse_list("man", &books);
assert_eq!(results, vec!(
FusableSearchResult{
index: 1,
score: 0.015000000000000003,
results: vec!(FResult{
value: String::from("author"),
score: 0.015000000000000003,
ranges: vec!((5..8)),
}),
},
FusableSearchResult{
index: 0,
score: 0.027999999999999997,
results: vec!(FResult{
value: String::from("title"),
score: 0.027999999999999997,
ranges: vec!((4..7)),
})
}
), "Fuseable Search returned incorrect results");
}
```
Furthermore, you can add a chunk size to run this over multiple threads.
Currently, the chunk size is one, so the chunks of size 1 will be run on seperate threads.
```rust
fuse.search_text_in_fuse_list_with_chunk_size("man", &books, 1, |x: FuseableSearchResult| {
dbg!(x);
});
```
#### Chunk search
You can look into chunk-search.rs for the source code, and can run the same with:
```shell
cargo run --example chunk-search
```