僕には「こういう関数って一般的になんて言うの?」と思ってる概念があります。ご存知の方がいらっしゃいましたら是非教えていただきたいです。
知りたい概念をざっくりいうと「配列Aと配列Bを引数にA→B変換経路を返す関数」です。一般名詞とかあるのでしょうか?
経路をJSON化したいので高階関数で渡されるのはちょっと困ります。たぶん下記の代数的データ型の配列で受け取れるものと思います。
enum Step{
add(value), remove(index), set(index, value)
}
多くの言語の配列には.whereや.mapや.reduceが生えています。そんな感じで生えてたらいいと思います。
例1
空の配列と [ 1 ] を引数に取った場合「1を追加する」を返す。
例2
[ 1, 2, 3] と [ 1, 2 ] を引数に取ると 「2個目の要素を消す」を返す。
hoge([ 1 , 2 , 3] , [ 1, 2]); // [{ type:"remove" , index: 2}]
例3
[ 1, 2, 3 ] と [ 1 , 2, 4 ] を引数に取ると「2個目の要素を4で上書きする」を返す。
hoge([1 , 2 , 3] , [ 1, 2 ,4]); // [{type: "set" , index: 2, value: 4}]
例4
違いがたくさんあってもいい感じに配列で返してくれる。
hoge([ 1 , 2 , 3 , 4 ] , [ 1 , 3 , 4 , 5 ]);
// [
// { type: "remove", index: 1},
// { type: "add" , value: 5} ,
// ]
使途
- MVCでMの変化にVを追従させたいときに使う
- サーバー・クライアント間の通信の容量削減
- 二次元配列の圧縮(MPEGの理屈)
- データベースを洗い替えしなくてよくする
- 配列を変更したときのログを見やすくする
- Thread間通信で、重い処理をするワーカースレッド側に負荷を押し付けてUIスレッドを軽量化する
- (↑と同じ話で)WASMでRustとJSの通信に使う
これまでの調査
レーベンシュタイン距離っていう似たような概念を見つけました。ただ、僕がほしいのは距離ではなく道筋です。
PHPのarray_diff関数も似ていますが、この出力と元の配列だけで次の配列を100%復元できないのでダメです。
欲を言えば
上記の例ではJS風オブジェクトで書きましたが、バイナリのほうがパフォーマンス的によろしそうです。エンコーダー、デコーダー、見やすいロガーがセットだといいです。
どんなプリミティブな操作が許されているかを段階的に指定できるといいと思います。ADD、REMOVE、SET以外のみ、REVERSE、SLICEしてもいい、FILTER、MAPしてもいい等。
たぶん
React.jsの中にそういう部品はあると思うのでコード読んでみようかなー。