本のままでは、動かず新しいバージョンに合わせた修正が必要だった。
よくわからないところを確認してみた。
Spec.hs
・applyFilterTestについて
^? 指定データを1部取り出したいとき使用(lens)
nth 2 リストの3番目要素取り出し
fmap Right (testData^?key "string-field") だと fmap::(a->b)->f a->f bでみると
(a->b)がRight f aがMaybe Value f bがJustつまりMaybe(Either e Value)
これにRightが適用なるようだ
Parser.hs
・queryArrayの jqQueryParser `sepBy` schar ',' について
sepByは中値だが、2引数関数で schar ','を区切りとして jqQueryParserでパース
Query.hs
・applyFilter (JqField fieldName n) obj@(Object _)
= join $ noteNotFoundError (T.pack fieldName) (fmap (applyFilter n) (obj ^? key (fromText(T.pack fieldName)))) について
obj@(Object _)はObjectとか確認し、その値をobjとして利用可能
joinはMaybeをはずすため
・executeQuery (JqQueryObject o) v
= fmap (Object . KM.fromList . fmap (\(k,v) -> (Key.fromText k, v)))
. sequence ②
. fmap sequence ①
$ fmap (fmap $ flip executeQuery v) o について
左辺の(JqQueryObject o) vは{"name":.name,"age":.age}::[(Text,JqQuery)]
右辺の fmap $ flip executeQuery v のflipは引数を逆順にして、部分適用を意図した 通りにするために使う。(flip executeQuery v) q == executeQuery q v
fmap (fmap $ flip executeQuery v) は、内側のfmapで( , )への処理を、外側のfmapで上の関数使って[ , , ]への処理を行う。
sequenceは①で Eitherを外に出していく [(either Text (Text,Value))]
②で Ehter Text [(Text,Value)]にする
パーシングは、なかなか複雑