Closed Hexirp closed 4 years ago
うーん、リソースの情報を纏められるという感じかな? リソースの更新日時とかメタデータとか。
全てのリソースは対応する識別子を持っている。リソースには更新日時がある。リソースにはメタデータが付属している場合もある。メタデータもリソースであり、識別子が付いている。
関連してそうなのは Metadata 作用と Universe 作用と Store 作用である。
Store 作用は type Storable a = (Typeable a, Binary a)
である型の値をストアに保存したり読み込む。
Universe 作用は、認識している全ての識別子を読み込むことが出来る。
Metadata 作用は、識別子に付随しているメタデータを読み込むことが出来る。
ここでポイントなのは空のメタデータが許されることか?
そういえば MetadataEnv
を作っていないな。不要だろうけど。
空のメタデータはこのようになる。
emptyMetadata :: Metadata
emptyMetadata = Metadata HM.empty
Provider 作用の中核になるべきなのは、この二つだろう。
resourceMetadata :: Provider -> Identifier -> IO Metadata
resourceBody :: Provider -> Identifier -> IO String
更新日時の作用とは分離すべきだろう。
さらに resourceMetadata
は getMetadata
と統合される……!
つまり、こうなる?
class MonadMetadata m => MonadProvider m where
getBody :: Identifier -> m String
ああ、それっぽい。出力を String だけに制限するのはどうしたものか。
ここでさらに Store 作用を加えるべきか?
もしかして Provider
って Store
を除けば不変なのか?
やはりそうだ。 newProvider
で生成した後は変化しない。確かに Store
もそうっちゃそうだからいいんだけど。
うーん、やっぱり内部で Store 作用を利用するので含めよう。
関数を一つずつ検索して、必要かどうか確かめていこう。
resourceFilePath
ってどうして必要なの? identifierPath
を使えばいいんじゃない? と思っていたけど、ファイルのパスに providerDirectory
を付けるのか。
getMetadata :: Identifier -> IO Metadata
resourceMetadata :: Identifier -> IO Metadata
resourceFilePath :: Identifier -> IO FilePath
resourceModificationTime :: Identifier -> IO UTFTime
resourceBody :: Identifier -> IO String
こういう風に色々な情報を取得できるようになっているんだな。
メタデータについてもっと考えないといけない。リソースには必ずメタデータが付いていると MonadMetadata
により設定されている。それで Metadata
はリソースなのか。識別子がつくのか。
嘘でしょ? メタデータの形式がここでハードコーディングされている。
こんなの意味がない。メタデータもコンパイラーで取得するようにしよう。
全てがリソースである、つまり全てに識別子が付く主義を取ると、メタデータのメタデータのメタデータという困ったことが起きる。
コンパイラの途中のデータもリソースと捉えるべきか? 分からない。
ここがメタデータがリソースとして扱われているらしき場所……かと思ったけど違うみたい?
識別子 (Identifier
) とファイルパス (FilePath
) の混同か?
Hexyll はリソースという概念を中心として動く。
別のモデルとして……
そして
何かを要求するときは、何が必要なのだろうか? 生の文字列? コンパイラー結果? 前者だろうな。
いや、コンパイラーの結果だ。それは SomeItem
で抽象化される。
一つのリソースに一つのコンパイラーが対応する……。
コンパイラーの多重化は identifierVersion
で実現されるのだろうか……?
纏めようか?
identifierVersion
が異なる識別子が複数存在する可能性もある。resourceInfoMetadata
は内部でしか使われていない。
だが、メタデータの取得の形式も自由にしたいので、メタデータもリソースとすることにする。
identifierVersion
が異なる識別子が複数存在する可能性もある。んんん……? 「メタデータに対応するリソースには更新日時が存在する」は、メタデータが別のファイルとして存在する形式 a.txt.metadata
に対応するためか?
identifierVersion
が異なる識別子が複数存在する可能性もある。たとえば、 index.md
をコンパイルするのに index.md
のメタデータが必要としよう。 index.md
のコンパイラーは index.md (metadata)
のコンパイル結果に依存する。 index.md (metadata)
のコンパイラーは生の index.md
が必要かもしれないし生の index.md.metadata
が必要かもしれない。
MonadProvider
はファイルに対応するリソースを扱うモナドであり……メタデータに関する機構はより高機能な箇所……つまり、コンパイラーなどで実装される。
MonadUniverse
はどうするか……。ファイルに対応するリソースが全てであるならば MonadProvider
が継承する道理はあるが。
しかし、そうではない。新しいリソースが登場する可能性がある。
ここは私の考察の裏付けになるな……
MonadProvider において Identifier は不要であり Path Rel File で十分。
Ident と略するのをやめようか。
H.C.Metadata のそもそもの設計が悪い可能性が?
See https://github.com/Hexirp/hexirp-hakyll/issues/98 .
Provider ディレクトリをつかさどる。補助として Store の作用を使う。