module AppStorage where
import System.Directory(XdgDirectory(..))
import ReadFileF
import WriteFile
import HbcUtils(apSnd)
import CompOps
import NullF
import Spops

appStorageF :: (Read a,Show a) => String -> a -> F a a
appStorageF :: String -> a -> F a a
appStorageF String
key a
d =
  (IOError -> a) -> (String -> a) -> Either IOError String -> a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (a -> IOError -> a
forall a b. a -> b -> a
const a
d) (a -> (a -> a) -> Maybe a -> a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe a
d a -> a
forall a. a -> a
id (Maybe a -> a) -> (String -> Maybe a) -> String -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Maybe a
forall a. Read a => String -> Maybe a
readM) (Either IOError String -> a)
-> ((String, Either IOError String) -> Either IOError String)
-> (String, Either IOError String)
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String, Either IOError String) -> Either IOError String
forall a b. (a, b) -> b
snd
  ((String, Either IOError String) -> a)
-> F String (String, Either IOError String) -> F String a
forall a b e. (a -> b) -> F e a -> F e b
>^=< [String]
-> F String (String, Either IOError String)
-> F String (String, Either IOError String)
forall hi ho. [hi] -> F hi ho -> F hi ho
startupF [String
key] (XdgDirectory -> F String (String, Either IOError String)
readXdgFileF XdgDirectory
XdgData)
  F String a
-> SP (String, Either IOError ()) String
-> F (String, Either IOError ()) a
forall c d e. F c d -> SP e c -> F e d
>=^^< SP (String, Either IOError ()) String
forall a b. SP a b
nullSP
  F (String, Either IOError ()) a
-> F a (String, Either IOError ()) -> F a a
forall a1 b a2. F a1 b -> F a2 a1 -> F a2 b
>==< XdgDirectory -> F (String, String) (String, Either IOError ())
writeXdgFileF XdgDirectory
XdgData
  F (String, String) (String, Either IOError ())
-> (a -> (String, String)) -> F a (String, Either IOError ())
forall c d e. F c d -> (e -> c) -> F e d
>=^< (,) String
key (String -> (String, String))
-> (a -> String) -> a -> (String, String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show

readM :: String -> Maybe a
readM String
x = case ReadS a
forall a. Read a => ReadS a
reads String
x of
            [(a
x,String
s)] | ReadS String
lex String
s [(String, String)] -> [(String, String)] -> Bool
forall a. Eq a => a -> a -> Bool
== [(String
"",String
"")] -> a -> Maybe a
forall a. a -> Maybe a
Just a
x
            [(a, String)]
_ -> Maybe a
forall a. Maybe a
Nothing