repos / handle-examples.hs.git


commit
3ff5b6d
parent
095b1d1
author
Evgenii Akentev
date
2021-01-09 00:29:03 +0400 +04
Fix backpack-handles example with two signatures
2 files changed,  +27, -21
M backpack-handles/backpack-handles.cabal
+20, -14
 1@@ -7,7 +7,7 @@ maintainer:          i@ak3n.com
 2 build-type:          Simple
 3 extra-source-files:  CHANGELOG.md
 4 
 5-library domain
 6+library domain-provider
 7   hs-source-dirs: domain
 8   signatures:      WeatherProvider
 9   default-language: Haskell2010
10@@ -17,18 +17,23 @@ library domain-reporter
11   hs-source-dirs: domain
12   signatures:      WeatherReporter
13   default-language: Haskell2010
14-  build-depends:    base, domain
15+  build-depends:    base, domain-provider
16 
17-library impl
18+library impl-provider
19   hs-source-dirs: impl
20   exposed-modules: SuperWeatherProvider
21-                 , SuperWeatherReporter
22-  reexported-modules: SuperWeatherProvider as WeatherProvider,
23-    SuperWeatherReporter as WeatherReporter
24+  reexported-modules: SuperWeatherProvider as WeatherProvider
25   default-language: Haskell2010
26   build-depends:    base
27 
28-library test-impl
29+library impl-reporter
30+  hs-source-dirs: impl
31+  exposed-modules: SuperWeatherReporter
32+  reexported-modules: SuperWeatherReporter as WeatherReporter
33+  default-language: Haskell2010
34+  build-depends:    base, domain-provider
35+
36+library test-provider
37   hs-source-dirs: test-impl
38   exposed-modules: TestWeatherProvider
39   reexported-modules: TestWeatherProvider as WeatherProvider
40@@ -38,8 +43,10 @@ library test-impl
41 executable main
42   main-is:             Main.hs
43   build-depends:       base >=4.13 && <4.14
44-                     , impl
45-                     , domain
46+                     , impl-provider
47+                     , impl-reporter
48+                     , domain-reporter
49+                     , domain-provider
50   default-language:    Haskell2010
51 
52 test-suite spec
53@@ -50,8 +57,7 @@ test-suite spec
54   build-depends:       base >= 4.7 && < 5
55                      , QuickCheck
56                      , hspec
57-                     , domain
58-                     , test-impl
59-                     , impl
60-  mixins:
61-    impl (WeatherProvider as UnusedWeatherProvider, WeatherReporter)
62+                     , domain-reporter
63+                     , domain-provider
64+                     , test-provider
65+                     , impl-reporter
M backpack-handles/impl/SuperWeatherReporter.hs
+7, -7
 1@@ -1,25 +1,25 @@
 2 module SuperWeatherReporter where
 3 
 4-import qualified SuperWeatherProvider
 5+import qualified WeatherProvider
 6 
 7 type WeatherReport = String
 8 
 9-type WeatherProviderHandle = SuperWeatherProvider.Handle
10+type WeatherProviderHandle = WeatherProvider.Handle
11 
12 -- | We hide dependencies in the handle
13-data Handle = Handle { weatherProvider :: SuperWeatherProvider.Handle }
14+data Handle = Handle { weatherProvider :: WeatherProvider.Handle }
15 
16 -- | Constructor for Handle
17-new :: SuperWeatherProvider.Handle -> Handle
18+new :: WeatherProvider.Handle -> Handle
19 new = Handle
20 
21 -- | Domain logic. Usually some pure code that might use mtl, free monads, etc.
22-createWeatherReport :: SuperWeatherProvider.WeatherData -> WeatherReport
23-createWeatherReport (SuperWeatherProvider.WeatherData temp) =
24+createWeatherReport :: WeatherProvider.WeatherData -> WeatherReport
25+createWeatherReport (WeatherProvider.WeatherData temp) =
26   "The current temperature in London is " ++ (show temp)
27 
28 -- | Domain logic that uses external dependency to get data and process it.
29 getCurrentWeatherReportInLondon :: Handle -> IO WeatherReport
30 getCurrentWeatherReportInLondon (Handle wph) = do
31-  weatherData <- SuperWeatherProvider.getWeatherData wph "London" "now"
32+  weatherData <- WeatherProvider.getWeatherData wph "London" "now"
33   return $ createWeatherReport weatherData