「メタデータ - 複数のデータ」みたいなのが複数ある構造で、ひとつずつ読んでいきたいとき、前のひとまとまりの終わりは「メタデータ」を読むまで最後かどうかわからないわけで、でも前の「ひとまとまり」のところでメタデータを読み込んじゃうと、次の「ひとまとまり」のときにメタデータを再読み込みすることになる。
状態の保存とかを使わずにきれいに書くにはどうしたらいいかな。
メタデータの内容を引数としてとり、次の「ひとまとまり」用のメタデータの内容を返り値として返すような関数またはモナドを使えば良さそうだ。
で次の「ひとまとまり」用のメタデータが存在しないときはNothingを返し、これを終了の合図にすればいい。
foo :: Meta -> m (Maybe Meta)
foos :: Meta -> m ()
foos m = foo m >>= \case
Nothing -> pure ()
Just m' -> foos m'