implementation module index import StdEnv import Data.Maybe import Data.Error import System.File import System.Directory import Text.GenJSON import Data.Tree derive JSONEncode RTree, FileInfo, Tm, MaybeError derive JSONDecode RTree, FileInfo, Tm, MaybeError :: MusicDB :== RTree MusicEntry :: MusicEntry = { fe_filepath :: !FilePath , fe_fileinfo :: !MaybeOSError FileInfo , fe_musicentry :: [!Tag!] } :: Tag = { tag_key :: !String , tag_value :: !String } index :: MusicDB (RTree (FilePath, MaybeOSError FileInfo)) *World -> *(MusicDB, *World) index (RNode mn mcs) (RNode (fp, mfi) fcs) w = (RNode mn mcs, w) dbfile = "db.json" root = "/mnt/data/music" writeDB db w # (ok, f, w) = fopen dbfile FWriteData w | not ok = abort "Cannot open file\n" # (ok, w) = fclose (f <<< toJSON db) w | not ok = abort "Cannot close file\n" = w Start w # (mfi, w) = getFileInfo root w | isError mfi = abort "Cannot open root\n" # (Ok fi) = mfi | not fi.directory = abort "Root is not a directory\n" # (tree, w) = readDirectoryTree root Nothing w # (db, w) = index (RNode {fe_filepath=root,fe_fileinfo=mfi,fe_musicentry=[!!]} []) tree w = writeDB tree w