diff --git a/src/Model.hs b/src/Model.hs index 2fd34ff..0155fb5 100644 --- a/src/Model.hs +++ b/src/Model.hs @@ -47,7 +47,6 @@ import Data.Thyme ( _localDay , _utctDay ) import Data.Thyme.Time ( toThyme ) -import Data.Text.Lazy ( pack ) import Lens.Micro.Platform ( (^.) , (&) , (%~) @@ -57,15 +56,12 @@ import System.Directory ( listDirectory , getAccessTime , removeFile ) import Text.Printf ( printf ) -import Network.Wreq ( get - , responseBody ) import Config import Model.Types import Model.Karen import Model.Wijkanders import Model.Linsen -import Util ( (^.^) ) -- | Refreshes menus. -- The refresh function evaluates to `Some monad m => m (View model, Update signal)`, @@ -131,8 +127,7 @@ update = do "21f31565-5c2b-4b47-d2a1-08d558129279" , karenR "S.M.A.K." "smak" "3ac68e11-bcee-425e-d2a8-08d558129279" , karenR "L's Kitchen" "ls-kitchen" "c74da2cf-aa1a-4d3a-9ba6-08d5569587a1" - , liftIO (get wijkandersAPIURL) >>= (^.^ responseBody) <&> - Restaurant "Wijkanders" (pack wijkandersAPIURL) . getWijkanders day' + , fetchAndCreateWijkanders day' , fetchAndCreateLinsen day' ] @@ -142,7 +137,4 @@ update = do liftIO getCurrentTime >>= liftIO . flip writeFile (show e) . flip (printf "%s/%s%s.txt" path) (name r) . show _ -> pure () - return (View rest textday d) - where - wijkandersAPIURL = "https://www.wijkanders.se/restaurangen" diff --git a/src/Model/Wijkanders.hs b/src/Model/Wijkanders.hs index 2d6d383..73c4d12 100644 --- a/src/Model/Wijkanders.hs +++ b/src/Model/Wijkanders.hs @@ -1,7 +1,6 @@ {-# LANGUAGE LambdaCase, OverloadedStrings #-} module Model.Wijkanders - ( getWijkanders - , hasDate + ( fetchAndCreateWijkanders ) where @@ -10,6 +9,8 @@ import Control.Arrow ( (***) , (>>>) ) import Control.Monad ( (<=<) ) +import Control.Monad.Catch ( MonadThrow ) +import Control.Monad.IO.Class ( MonadIO (liftIO) ) import Data.Attoparsec.ByteString.Lazy ( maybeResult , parse , skip @@ -18,9 +19,11 @@ import Data.Attoparsec.ByteString.Lazy ( maybeResult , takeWhile1 ) import Data.ByteString.Lazy ( ByteString ) +import Data.Text.Lazy ( pack ) import qualified Data.ByteString.Char8 as B8 import qualified Data.ByteString.Lazy as BL import qualified Data.ByteString.Lazy.Char8 as BL8 +import Data.Functor ( (<&>) ) import Data.Maybe ( mapMaybe ) import Data.Text.Encoding.Error ( ignore ) import Data.Text.Encoding ( encodeUtf8 ) @@ -36,6 +39,8 @@ import Data.Thyme ( Day ) import qualified Data.Word8 as W8 import Lens.Micro.Platform ( view ) +import Network.Wreq ( get + , responseBody ) import Safe ( atMay ) import Text.HTML.TagSoup ( (~==) , (~/=) @@ -47,9 +52,13 @@ import Text.HTML.TagSoup ( (~==) import Text.HTML.TagSoup.Match ( tagText ) import Model.Types ( Menu(..) - , NoMenu(..) + , NoMenu(..), Restaurant (Restaurant) ) -import Util ( removeWhitespaceTags ) +import Util ( removeWhitespaceTags + , (^.^) ) + +wijkandersAPIURL :: String +wijkandersAPIURL = "https://www.wijkanders.se/restaurangen" -- | Looks for strings looking like dates, dd/mm where d and m are digits. -- ..and gives them in another order to play nice with the @@ -109,3 +118,12 @@ getWijkanders d b = go b >>> \case [] -> Left (NMParseError "Wijkanders failed" b) xs -> Right xs + +fetchAndCreateWijkanders + :: (MonadIO m, MonadThrow m) + => Day + -> m Restaurant +fetchAndCreateWijkanders day = + liftIO (get wijkandersAPIURL) >>= + (^.^ responseBody) <&> + Restaurant "Wijkanders" (pack wijkandersAPIURL) . getWijkanders day