deno-asearch
Deno用asearch
/icons/github.icontakker99/deno-asearch
機能
/icons/done.icon曖昧一致したかどうか
/icons/done.iconその時のあいまい度
これはnode-asearchにはない機能
実装したいこと
1回の遷移ごとの状態遷移機械をdeno testしたい
よく考えたら、ある距離以内でマッチしているかどうか判定するだけなら全てのレジスタを一つずつマスクする必要ないじゃん!
全てのレジスタをORしたやつをマスクすればいい
ある距離以内でのマッチを判定する関数は削除した
ワイルドカードにマッチしたら、曖昧度を1だけ増やしたい
マッチした箇所
そもそも取得できるのかどうかすらわからない
ビットパラレル手法によるアライメントアルゴリズムによると、algorithmを工夫すれば取得できるらしいが…
✅文字列長比較だけで編集距離を計算できるものはあいまい検索しない
修正点
unpackをfor loopに置き換えた
String.prototype.split("")は書記素クラスタを破壊してしまう
ついでにiteratorにして、不要な配列生成・破棄をなくす
arraybuffer止めた
メモリサイズを抑えるA Fast Bit-Vector Algorithm for Approximate String Matching Based on Dynamic Programming
shiftpadを固定長配列ではなくMap (JavaScript)として保持すればいいのでは?
どうせハッシュテーブルだし、そんなに検索に時間をかけないだろう
その他refactoring
いっそwasmを手書きしてみるか?
unicode変換できるのかな?
バグ
実装
rust-asearchをweb assemblyにして使う
Rust側
Rustで関数を返す関数を作っておく
TS側
wasmは予めUint8Arrayに変換しておく
umd版を用意しておく
web workerから使えるようにする
2022-02-11
12:56:06 release 0.3.0
test()のJSDocの解説がおかしいので直す
最大距離ではなく、ちょうどその距離にマッチするかどうかを調べる
12:27:07 done
https://github.com/takker99/deno-asearch/pull/6
2022-01-23
16:38:37 release 0.2.1
16:27:13 CI入れた
Add ci by takker99 · Pull Request #3 · takker99/deno-asearch
2022-01-19
✅状態遷移機械をexportする
2021-11-13
13:14:22 0cbc02
Deno Nested test APIで書き換えた
テストデータを追加しやすいように構造を変えた
08:08:53 92bb426
全てのUnicode charctersに対応した
多分ほんの少しだけ速くなった
ほとんど誤差程度だが
メモリ消費量を抑えた
遷移可能テーブルを、必要な文字の分だけ作るようにした
2021-10-11
20:29:23 deno-asearch#61640c381280f0000025f2aa
19:47:57 まずはnode-asearchと同じものを実装した
19:03:56 一旦TypeScriptだけで書いたやつを作っておく
code:mod.ts
export * from "https://raw.githubusercontent.com/takker99/deno-asearch/0.4.0/mod.ts";
↓でコンパイルが通らない……
wasm-bindgen関連で型定義が違うと怒られる
Rustの型システムを1からしっかり読み込まないと先には進めなさそう
References
wasm_bindgen::closure::Closure - Rust
wasmのEventListenerの実装をコードとともに見てみる - Qiita
実質的な家賃を計算するツールをRustのwasmで作りました – ぷるぷるした直方体
code:lib.rs
use asearch::Asearch;
use wasm_bindgen::prelude::*;
#wasm_bindgen
pub struct ClosureHandle(Closure<dyn FnMut(&str, u8) -> bool>);
#wasm_bindgen
pub fn asearch(source: &str) -> ClosureHandle {
let asearch = Asearch::new(source);
let cb = Closure::wrap(Box::new(move |text, ambig| {
asearch.find(text, ambig);
}) as Box<dyn FnMut(&str,u8) -> bool>);
ClosureHandle(cb)
}
code:Cargo.toml
package
name = "deno-asearch"
version = "0.1.0"
authors = "takker"
edition = "2018"
lib
crate-type = "cdylib"
dependencies
wasm-bindgen = "0.2.73"
asearch = "0.1.2"
#2022-08-23 06:22:00
#2022-07-17 18:43:32
#2022-07-11 13:41:28
#2022-02-11 11:25:20
#2022-01-31 06:13:17
#2022-01-23 15:25:47
#2022-01-19 13:58:02
#2022-01-18 20:38:30
#2022-01-08 22:32:02
#2021-10-12 09:44:18
#2021-10-11 19:05:06
#2021-06-16 12:15:14