save and load
いい加減、Haskellで何かまとまったものを作らないと、このもやっと感が消えてくれないのです。
というわけで。
GUIはまとまった時間が取れないとなかなか勉強する時間とれそうにないので、周辺パーツから揃えていくことに。
データをsaveするための関数を作りましょう。
管理しやすいように、
いくつかのファイルにわけて製作していきます。
まずは、基本的にどのファイルでも使うことになるであろう型達を定義
module Types where data GameState = Title | Playing | Save | Load | Exit data Music = PlayOn String | Silence deriving (Show,Eq) type Layer = Int type ImageFile = String type ScreenState = [ (Layer , ImageFile) ] type Date = String type FLine = Int datafile :: FilePath datafile = "d.txt"
次に、save関数
module SaveLoad where import System.IO import Types save :: Date -> FLine -> ScreenState -> Music -> IO() save date n scr mg = do h <- openFile datafile AppendMode hPutStrLn h $ date ++ " " ++ (show n) hPrint h scr hPutStrLn h $ show mg hClose h
save関数に適当に引数を渡して記録した結果は次のように。
当たり前ですけど笑
2011/10/14 13 [(0,"back"),(1,"mesbox.png")] Silence 2011/10/1 265 [(0,"back"),(1,"mesbox.png"),(2,"haskell.png")] Silence 2011/10/1 265 [(0,"back"),(1,"mesbox.png"),(2,"haskell.png")] PlayOn "bgm.wav"
次は、こいつをloadする関数を書いていきます
まずは、Parsec部分以外の関数が上手く機能していくるか確認するための検証を。
ScreenStateの部分をStringと書き変えて確認。
load :: Int -> IO (Date,FLine,String,Music) load k = do h <- openFile datafile ReadMode fs <- hGetContents h result <- extract.pickedData $ fs return result where pickedData = take datanum.drop (k*datanum).lines extract :: [String] -> IO (Date,FLine,String,Music) extract [l1,l2,l3] = parseRun l2 >>= \scr -> return (date,read n,scr,mg) where [date,n] = take 2.words $ l1 mg :: Music mg = case l3 of "Silence" -> Silence otherwise -> PlayOn $ last.words $ l3 parseRun :: String -> IO String parseRun str = return str
無事に動作しています。
では最後に、Parser部を書いていきます
その前に、お腹がへったので何かエネルギー補給をする。