[vinyl-handle]: implement providers properly
authorEvgenii Akentev <i@ak3n.com>
Sat, 9 Jan 2021 15:40:35 +0000 (20:40 +0500)
committerEvgenii Akentev <i@ak3n.com>
Sat, 9 Jan 2021 15:40:35 +0000 (20:40 +0500)
vinyl-handle/Main.hs
vinyl-handle/impl/SuperTemperatureProvider.hs [new file with mode: 0644]
vinyl-handle/impl/SuperWeatherProvider.hs
vinyl-handle/impl/SuperWindProvider.hs [new file with mode: 0644]
vinyl-handle/vinyl-handle.cabal

index 197df484b328e34b6dba9023417f988288efe959..5301f042ea58ea62b5299297a5119ab84014913e 100644 (file)
@@ -1,6 +1,8 @@
 module Main where
 
 import qualified SuperWeatherProvider
+import qualified SuperWindProvider
+import qualified SuperTemperatureProvider
 import qualified WeatherProvider
 import qualified WeatherReporter
 
@@ -8,7 +10,10 @@ import qualified WeatherReporter
 -- our concrete implementation of `WeatherProvider`.
 main :: IO ()
 main = do
-  let wph = SuperWeatherProvider.new
-  let wrh = WeatherReporter.new wph
+  let
+    wp = SuperWindProvider.new
+    tp = SuperTemperatureProvider.new
+    wph = SuperWeatherProvider.new wp tp
+    wrh = WeatherReporter.new wph
   weatherReportInLondon <- WeatherReporter.getCurrentWeatherReportInLondon wrh
   putStrLn weatherReportInLondon
diff --git a/vinyl-handle/impl/SuperTemperatureProvider.hs b/vinyl-handle/impl/SuperTemperatureProvider.hs
new file mode 100644 (file)
index 0000000..656c01e
--- /dev/null
@@ -0,0 +1,12 @@
+module SuperTemperatureProvider where
+
+import Data.Vinyl
+import TemperatureProvider
+import QueryTypes
+
+new :: Handle
+new = Field getSuperTemperatureData
+  :& RNil
+
+getSuperTemperatureData :: Location -> Day -> IO Temperature
+getSuperTemperatureData _ _ = return 30
index 885976d16fc3e36ddda12f1871aae3553ec9caf2..4333fa651162af24b8c1e9ab0e0eb1a49df369b3 100644 (file)
@@ -2,22 +2,14 @@ module SuperWeatherProvider where
 
 import Data.Vinyl
 import WeatherProvider
-import TemperatureProvider (Temperature)
-import WindProvider (WindSpeed)
+import qualified TemperatureProvider
+import qualified WindProvider
 import QueryTypes
 
-new :: Handle
-new = Field getSuperWeatherData
-  :& Field getSuperWindData
-  :& Field getSuperTemperatureData
-  :& RNil
+new :: WindProvider.Handle -> TemperatureProvider.Handle -> Handle
+new wp tp = Field getSuperWeatherData
+  :& RNil <+> wp <+> tp
 
 -- | This is some concrete implementation `WeatherProvider` interface
 getSuperWeatherData :: Location -> Day -> IO WeatherData
 getSuperWeatherData _ _ = return $ WeatherData 30 10
-
-getSuperTemperatureData :: Location -> Day -> IO Temperature
-getSuperTemperatureData _ _ = return 30
-
-getSuperWindData :: Location -> Day -> IO WindSpeed
-getSuperWindData _ _ = return 5
diff --git a/vinyl-handle/impl/SuperWindProvider.hs b/vinyl-handle/impl/SuperWindProvider.hs
new file mode 100644 (file)
index 0000000..d601d02
--- /dev/null
@@ -0,0 +1,12 @@
+module SuperWindProvider where
+
+import Data.Vinyl
+import WindProvider
+import QueryTypes
+
+new :: Handle
+new = Field getSuperWindData
+  :& RNil
+
+getSuperWindData :: Location -> Day -> IO WindSpeed
+getSuperWindData _ _ = return 5
index c020c20446fe05f5a72f57b768828ec41e3233fa..4d9b821a4907c43ef9ff73bcc8c426006dcf1459 100644 (file)
@@ -21,6 +21,8 @@ library domain
 library impl
   hs-source-dirs: impl
   exposed-modules: SuperWeatherProvider
+                 , SuperWindProvider
+                 , SuperTemperatureProvider
   default-language: Haskell2010
   build-depends:    base, domain, vinyl