/home/simba/murmur.txt
如果 simbafs/tree 要支援動畫,樹應該要改成 immutable,然後 Tree.Op() 會回傳一個有 UpdateTreeCmd 的陣列,依序執行 每個 UpdateTreeCmd 代表一刻的狀態 但這樣就會大幅介入演算法的執行。例如 search 這個動作,就要每移動一次 current 就回傳一個 tree,那麼現在在執行什麼動作、各個指標指在哪裡都要存在 Tree 裡 Tree 新增欄位 jobs 和 map[string]pointers jobs[0] 表示目前在幹嘛,例如 search…
MVP 是做出來了,但是不好用,首先定義「動作」,一個動作是指一個會在畫面上顯示的一幀,一個動作內可以把整個 avl insert, rebalance 全部做完。也可以全部拆開,每 search 一層一個動作、插入一個動作、每 rebalance 一層又是各自一個動作。不過因為目前設計的關係每個動作都是獨立、無狀態的函數,所以狀態就要存在 tree 或是 msg 裡。打個比方,就好像畫畫時每動一筆就被人打斷、叫去旁邊站著,讓人拍完一幀再回來畫下一筆,然後又被打斷……
整個程式寫起來非常麻煩,要區分很多不同種類的動作、決定下一個動作等等,而且現在的架構是強制 tail calling,所以無法往下搜尋完後往上再 rebalance
要解決這個問題的話我有個想法,弄一個 PackedMsg,一次拆一層,回傳 Cmd 時可以塞不只一個進去,最外層的就是下次執行的 Cmd。但是這個寫起來也麻煩,不直覺
以上是比較符合 bubbletea 設計的做法,另一個解法是開一個 goroutine,每一個動作就往某個 channel 送出訊號,通知 update 可以畫了(這裡怎麼設計還得想想,可能是傳一整個樹的 snapshot 過去?),並且等待 Update 通知完成的訊號再進行下一步,這樣就類似 motion canvas 用 yeild 暫停函數的做法