never executed always true always false
1 {-# LANGUAGE FlexibleInstances #-}
2 {-# LANGUAGE RankNTypes #-}
3 module HelVM.HelMA.Automaton.API.Env where
4
5 import HelVM.HelMA.Automaton.API.AppOptions
6 import HelVM.HelMA.Automaton.API.IOTypes
7
8 import qualified Codec.Picture as Picture
9
10 import Lens.Micro.TH ( makeLenses )
11
12 import qualified RIO
13
14 data FileIO
15 = FileIO
16 { readTextFile :: forall env. FilePath -> RIO.RIO env Source
17 , readImage :: forall env. FilePath -> RIO.RIO env Picture.DynamicImage
18 }
19
20 data StdIO
21 = StdIO
22 { stdPutLTextLn :: forall env. LText -> RIO.RIO env ()
23 , stdGetContentsText :: forall env. RIO.RIO env LText
24 , stdPutLBSLn :: forall env. LByteString -> RIO.RIO env ()
25 , stdGetContentsBS :: forall env. RIO.RIO env LByteString
26 }
27
28 data Env
29 = Env
30 { _envFileIO :: FileIO
31 , _envStdIO :: StdIO
32 , _envOptions :: AppOptions
33 , _envLogFunc :: RIO.LogFunc
34 }
35
36 makeLenses ''Env
37
38 type Has env = (HasIO env, HasAppOptions env, RIO.HasLogFunc env)
39 type HasIO env = (HasFileIO env, HasStdIO env)
40
41 class HasFileIO env where
42 fileIOL :: RIO.Lens' env FileIO
43
44 instance HasFileIO Env where
45 fileIOL = envFileIO
46
47 class HasStdIO env where
48 stdIOL :: RIO.Lens' env StdIO
49
50 instance HasStdIO Env where
51 stdIOL = envStdIO
52
53 class HasAppOptions env where
54 appOptionsL :: RIO.Lens' env AppOptions
55
56 instance HasAppOptions Env where
57 appOptionsL = envOptions
58
59 instance RIO.HasLogFunc Env where
60 logFuncL = envLogFunc
61
62 readSourceFileRio ∷ Has env ⇒ RIO.RIO env Source
63 readSourceFileRio = readSourceFileWithOptions =<< optionsRio where
64 readSourceFileWithOptions = readSourceFile <$> exec <*> file
65 readSourceFile True = pure . toText
66 readSourceFile _ = readTextFileRio
67
68 readTextFileRio ∷ Has env ⇒ FilePath → RIO.RIO env Source
69 readTextFileRio fp = do
70 io <- RIO.view fileIOL
71 readTextFile io fp
72
73 readImageRio ∷ Has env ⇒ FilePath → RIO.RIO env Picture.DynamicImage
74 readImageRio fp = do
75 io <- RIO.view fileIOL
76 readImage io fp
77
78 putLTextLnRio ∷ Has env ⇒ LText → RIO.RIO env ()
79 putLTextLnRio text = do
80 io <- RIO.view stdIOL
81 stdPutLTextLn io text
82
83 getContentsTextRio ∷ Has env ⇒ RIO.RIO env LText
84 getContentsTextRio = do
85 io <- RIO.view stdIOL
86 stdGetContentsText io
87
88 putLBSLnRio ∷ Has env ⇒ LByteString → RIO.RIO env ()
89 putLBSLnRio lbs = do
90 io <- RIO.view stdIOL
91 stdPutLBSLn io lbs
92
93 getContentsBSRio ∷ Has env ⇒ RIO.RIO env LByteString
94 getContentsBSRio = do
95 io <- RIO.view stdIOL
96 stdGetContentsBS io
97
98 optionsRio ∷ Has env ⇒ RIO.RIO env AppOptions
99 optionsRio = RIO.view appOptionsL
100
101 logFuncRio ∷ Has env ⇒ RIO.RIO env RIO.LogFunc
102 logFuncRio = RIO.view RIO.logFuncL