metar 0.0.3 → 0.0.4
raw patch · 8 files changed
+261/−381 lines, 8 filesdep −network-uridep −tagsoupdep −tagsoup-selectiondep ~QuickCheckdep ~bytestringdep ~checkersPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies removed: network-uri, tagsoup, tagsoup-selection
Dependency ranges changed: QuickCheck, bytestring, checkers, deriving-compat, http-client, lens, semigroupoids, semigroups, tasty, tasty-hunit, tasty-quickcheck, transformers
API changes (from Hackage documentation)
- Data.Aviation.Metar: getAllMETAR :: String -> TAFResultT IO [String]
- Data.Aviation.Metar: getAllTAF :: String -> TAFResultT IO [String]
- Data.Aviation.Metar: getBOMTAF :: String -> TAFResultT IO BOMTAFResponse
- Data.Aviation.Metar.BOMTAFResult: BOMTAFResponse :: String -> [String] -> [String] -> BOMTAFResponse
- Data.Aviation.Metar.BOMTAFResult: [_bomMETAR] :: BOMTAFResponse -> [String]
- Data.Aviation.Metar.BOMTAFResult: [_bomTAF] :: BOMTAFResponse -> [String]
- Data.Aviation.Metar.BOMTAFResult: [_bomTitle] :: BOMTAFResponse -> String
- Data.Aviation.Metar.BOMTAFResult: bOMTAFResponse :: HasBOMTAFResponse c_aew3 => Lens' c_aew3 BOMTAFResponse
- Data.Aviation.Metar.BOMTAFResult: bomMETAR :: HasBOMTAFResponse c_aew3 => Lens' c_aew3 [String]
- Data.Aviation.Metar.BOMTAFResult: bomTAF :: HasBOMTAFResponse c_aew3 => Lens' c_aew3 [String]
- Data.Aviation.Metar.BOMTAFResult: bomTitle :: HasBOMTAFResponse c_aew3 => Lens' c_aew3 String
- Data.Aviation.Metar.BOMTAFResult: class HasBOMTAFResponse c_aew3
- Data.Aviation.Metar.BOMTAFResult: data BOMTAFResponse
- Data.Aviation.Metar.BOMTAFResult: instance Data.Aviation.Metar.BOMTAFResult.HasBOMTAFResponse Data.Aviation.Metar.BOMTAFResult.BOMTAFResponse
- Data.Aviation.Metar.BOMTAFResult: instance GHC.Classes.Eq Data.Aviation.Metar.BOMTAFResult.BOMTAFResponse
- Data.Aviation.Metar.BOMTAFResult: instance GHC.Classes.Ord Data.Aviation.Metar.BOMTAFResult.BOMTAFResponse
- Data.Aviation.Metar.BOMTAFResult: instance GHC.Show.Show Data.Aviation.Metar.BOMTAFResult.BOMTAFResponse
- Data.Aviation.Metar.TAFResult: ConnErrorResult :: ConnError -> TAFResult a
- Data.Aviation.Metar.TAFResult: ParseErrorResult :: TAFResult a
- Data.Aviation.Metar.TAFResult: TAFResultValue :: a -> TAFResult a
- Data.Aviation.Metar.TAFResult: _ConnErrorResult :: AsTAFResult r_ahiB a_aguZ => Prism' r_ahiB ConnError
- Data.Aviation.Metar.TAFResult: _ParseErrorResult :: AsTAFResult r_ahiB a_aguZ => Prism' r_ahiB ()
- Data.Aviation.Metar.TAFResult: _TAFResult :: AsTAFResult r_ahiB a_aguZ => Prism' r_ahiB (TAFResult a_aguZ)
- Data.Aviation.Metar.TAFResult: _TAFResultValue :: AsTAFResult r_ahiB a_aguZ => Prism' r_ahiB a_aguZ
- Data.Aviation.Metar.TAFResult: class AsTAFResult r_ahiB a_aguZ | r_ahiB -> a_aguZ
- Data.Aviation.Metar.TAFResult: class HasTAFResult c_ahcc a_aguZ | c_ahcc -> a_aguZ
- Data.Aviation.Metar.TAFResult: data TAFResult a
- Data.Aviation.Metar.TAFResult: instance Data.Aviation.Metar.TAFResult.AsTAFResult (Data.Aviation.Metar.TAFResult.TAFResult a) a
- Data.Aviation.Metar.TAFResult: instance Data.Aviation.Metar.TAFResult.HasTAFResult (Data.Aviation.Metar.TAFResult.TAFResult a) a
- Data.Aviation.Metar.TAFResult: instance Data.Foldable.Foldable Data.Aviation.Metar.TAFResult.TAFResult
- Data.Aviation.Metar.TAFResult: instance Data.Functor.Alt.Alt Data.Aviation.Metar.TAFResult.TAFResult
- Data.Aviation.Metar.TAFResult: instance Data.Functor.Bind.Class.Apply Data.Aviation.Metar.TAFResult.TAFResult
- Data.Aviation.Metar.TAFResult: instance Data.Functor.Bind.Class.Bind Data.Aviation.Metar.TAFResult.TAFResult
- Data.Aviation.Metar.TAFResult: instance Data.Functor.Classes.Eq1 Data.Aviation.Metar.TAFResult.TAFResult
- Data.Aviation.Metar.TAFResult: instance Data.Functor.Classes.Show1 Data.Aviation.Metar.TAFResult.TAFResult
- Data.Aviation.Metar.TAFResult: instance Data.Functor.Extend.Extend Data.Aviation.Metar.TAFResult.TAFResult
- Data.Aviation.Metar.TAFResult: instance Data.Traversable.Traversable Data.Aviation.Metar.TAFResult.TAFResult
- Data.Aviation.Metar.TAFResult: instance GHC.Base.Applicative Data.Aviation.Metar.TAFResult.TAFResult
- Data.Aviation.Metar.TAFResult: instance GHC.Base.Functor Data.Aviation.Metar.TAFResult.TAFResult
- Data.Aviation.Metar.TAFResult: instance GHC.Base.Monad Data.Aviation.Metar.TAFResult.TAFResult
- Data.Aviation.Metar.TAFResult: instance GHC.Base.Semigroup (Data.Aviation.Metar.TAFResult.TAFResult a)
- Data.Aviation.Metar.TAFResult: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Aviation.Metar.TAFResult.TAFResult a)
- Data.Aviation.Metar.TAFResult: instance GHC.Show.Show a => GHC.Show.Show (Data.Aviation.Metar.TAFResult.TAFResult a)
- Data.Aviation.Metar.TAFResult: tAFResult :: HasTAFResult c_ahcc a_aguZ => Lens' c_ahcc (TAFResult a_aguZ)
- Data.Aviation.Metar.TAFResultT: TAFResultT :: f (TAFResult a) -> TAFResultT f a
- Data.Aviation.Metar.TAFResultT: class HasTAFResultT c_ajCy f_ajBX a_ajBY | c_ajCy -> f_ajBX a_ajBY
- Data.Aviation.Metar.TAFResultT: instance (Data.Aviation.Metar.TAFResultT.TAFResultT f1 a1 Data.Type.Equality.~ t) => Control.Lens.Wrapped.Rewrapped (Data.Aviation.Metar.TAFResultT.TAFResultT f2 a2) t
- Data.Aviation.Metar.TAFResultT: instance (GHC.Classes.Eq a, Data.Functor.Classes.Eq1 f) => GHC.Classes.Eq (Data.Aviation.Metar.TAFResultT.TAFResultT f a)
- Data.Aviation.Metar.TAFResultT: instance (GHC.Show.Show a, Data.Functor.Classes.Show1 f) => GHC.Show.Show (Data.Aviation.Metar.TAFResultT.TAFResultT f a)
- Data.Aviation.Metar.TAFResultT: instance Control.Lens.Wrapped.Wrapped (Data.Aviation.Metar.TAFResultT.TAFResultT f a)
- Data.Aviation.Metar.TAFResultT: instance Control.Monad.IO.Class.MonadIO f => Control.Monad.IO.Class.MonadIO (Data.Aviation.Metar.TAFResultT.TAFResultT f)
- Data.Aviation.Metar.TAFResultT: instance Control.Monad.Trans.Class.MonadTrans Data.Aviation.Metar.TAFResultT.TAFResultT
- Data.Aviation.Metar.TAFResultT: instance Data.Aviation.Metar.TAFResultT.HasTAFResultT (Data.Aviation.Metar.TAFResultT.TAFResultT f a) f a
- Data.Aviation.Metar.TAFResultT: instance Data.Foldable.Foldable f => Data.Foldable.Foldable (Data.Aviation.Metar.TAFResultT.TAFResultT f)
- Data.Aviation.Metar.TAFResultT: instance Data.Functor.Classes.Eq1 f => Data.Functor.Classes.Eq1 (Data.Aviation.Metar.TAFResultT.TAFResultT f)
- Data.Aviation.Metar.TAFResultT: instance Data.Functor.Classes.Show1 f => Data.Functor.Classes.Show1 (Data.Aviation.Metar.TAFResultT.TAFResultT f)
- Data.Aviation.Metar.TAFResultT: instance Data.Functor.Extend.Extend f => Data.Functor.Extend.Extend (Data.Aviation.Metar.TAFResultT.TAFResultT f)
- Data.Aviation.Metar.TAFResultT: instance Data.Traversable.Traversable f => Data.Traversable.Traversable (Data.Aviation.Metar.TAFResultT.TAFResultT f)
- Data.Aviation.Metar.TAFResultT: instance GHC.Base.Functor f => GHC.Base.Functor (Data.Aviation.Metar.TAFResultT.TAFResultT f)
- Data.Aviation.Metar.TAFResultT: instance GHC.Base.Monad f => Data.Functor.Alt.Alt (Data.Aviation.Metar.TAFResultT.TAFResultT f)
- Data.Aviation.Metar.TAFResultT: instance GHC.Base.Monad f => Data.Functor.Bind.Class.Apply (Data.Aviation.Metar.TAFResultT.TAFResultT f)
- Data.Aviation.Metar.TAFResultT: instance GHC.Base.Monad f => Data.Functor.Bind.Class.Bind (Data.Aviation.Metar.TAFResultT.TAFResultT f)
- Data.Aviation.Metar.TAFResultT: instance GHC.Base.Monad f => GHC.Base.Applicative (Data.Aviation.Metar.TAFResultT.TAFResultT f)
- Data.Aviation.Metar.TAFResultT: instance GHC.Base.Monad f => GHC.Base.Monad (Data.Aviation.Metar.TAFResultT.TAFResultT f)
- Data.Aviation.Metar.TAFResultT: instance GHC.Base.Monad f => GHC.Base.Semigroup (Data.Aviation.Metar.TAFResultT.TAFResultT f a)
- Data.Aviation.Metar.TAFResultT: newtype TAFResultT f a
- Data.Aviation.Metar.TAFResultT: tAFResultT :: HasTAFResultT c_ajCy f_ajBX a_ajBY => Lens' c_ajCy (TAFResultT f_ajBX a_ajBY)
+ Data.Aviation.Metar.METARResult: ConnErrorResult :: ConnError -> METARResult a
+ Data.Aviation.Metar.METARResult: METARResultValue :: a -> METARResult a
+ Data.Aviation.Metar.METARResult: ParseErrorResult :: METARResult a
+ Data.Aviation.Metar.METARResult: _ConnErrorResult :: AsMETARResult r a => Prism' r ConnError
+ Data.Aviation.Metar.METARResult: _METARResult :: AsMETARResult r a => Prism' r (METARResult a)
+ Data.Aviation.Metar.METARResult: _METARResultValue :: AsMETARResult r a => Prism' r a
+ Data.Aviation.Metar.METARResult: _ParseErrorResult :: AsMETARResult r a => Prism' r ()
+ Data.Aviation.Metar.METARResult: class AsMETARResult r a | r -> a
+ Data.Aviation.Metar.METARResult: class HasMETARResult c a | c -> a
+ Data.Aviation.Metar.METARResult: data METARResult a
+ Data.Aviation.Metar.METARResult: instance Data.Aviation.Metar.METARResult.AsMETARResult (Data.Aviation.Metar.METARResult.METARResult a) a
+ Data.Aviation.Metar.METARResult: instance Data.Aviation.Metar.METARResult.HasMETARResult (Data.Aviation.Metar.METARResult.METARResult a) a
+ Data.Aviation.Metar.METARResult: instance Data.Foldable.Foldable Data.Aviation.Metar.METARResult.METARResult
+ Data.Aviation.Metar.METARResult: instance Data.Functor.Bind.Class.Apply Data.Aviation.Metar.METARResult.METARResult
+ Data.Aviation.Metar.METARResult: instance Data.Functor.Bind.Class.Bind Data.Aviation.Metar.METARResult.METARResult
+ Data.Aviation.Metar.METARResult: instance Data.Functor.Classes.Eq1 Data.Aviation.Metar.METARResult.METARResult
+ Data.Aviation.Metar.METARResult: instance Data.Functor.Classes.Show1 Data.Aviation.Metar.METARResult.METARResult
+ Data.Aviation.Metar.METARResult: instance Data.Functor.Extend.Extend Data.Aviation.Metar.METARResult.METARResult
+ Data.Aviation.Metar.METARResult: instance Data.Traversable.Traversable Data.Aviation.Metar.METARResult.METARResult
+ Data.Aviation.Metar.METARResult: instance GHC.Base.Applicative Data.Aviation.Metar.METARResult.METARResult
+ Data.Aviation.Metar.METARResult: instance GHC.Base.Functor Data.Aviation.Metar.METARResult.METARResult
+ Data.Aviation.Metar.METARResult: instance GHC.Base.Monad Data.Aviation.Metar.METARResult.METARResult
+ Data.Aviation.Metar.METARResult: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Aviation.Metar.METARResult.METARResult a)
+ Data.Aviation.Metar.METARResult: instance GHC.Show.Show a => GHC.Show.Show (Data.Aviation.Metar.METARResult.METARResult a)
+ Data.Aviation.Metar.METARResult: mETARResult :: HasMETARResult c a => Lens' c (METARResult a)
+ Data.Aviation.Metar.METARResultT: METARResultT :: f (METARResult a) -> METARResultT (f :: Type -> Type) a
+ Data.Aviation.Metar.METARResultT: class HasMETARResultT c (f :: Type -> Type) a | c -> f a
+ Data.Aviation.Metar.METARResultT: instance (Data.Aviation.Metar.METARResultT.METARResultT f1 a1 GHC.Types.~ t) => Control.Lens.Wrapped.Rewrapped (Data.Aviation.Metar.METARResultT.METARResultT f2 a2) t
+ Data.Aviation.Metar.METARResultT: instance (GHC.Classes.Eq a, Data.Functor.Classes.Eq1 f) => GHC.Classes.Eq (Data.Aviation.Metar.METARResultT.METARResultT f a)
+ Data.Aviation.Metar.METARResultT: instance (GHC.Show.Show a, Data.Functor.Classes.Show1 f) => GHC.Show.Show (Data.Aviation.Metar.METARResultT.METARResultT f a)
+ Data.Aviation.Metar.METARResultT: instance Control.Lens.Wrapped.Wrapped (Data.Aviation.Metar.METARResultT.METARResultT f a)
+ Data.Aviation.Metar.METARResultT: instance Control.Monad.IO.Class.MonadIO f => Control.Monad.IO.Class.MonadIO (Data.Aviation.Metar.METARResultT.METARResultT f)
+ Data.Aviation.Metar.METARResultT: instance Control.Monad.Trans.Class.MonadTrans Data.Aviation.Metar.METARResultT.METARResultT
+ Data.Aviation.Metar.METARResultT: instance Data.Aviation.Metar.METARResultT.HasMETARResultT (Data.Aviation.Metar.METARResultT.METARResultT f a) f a
+ Data.Aviation.Metar.METARResultT: instance Data.Foldable.Foldable f => Data.Foldable.Foldable (Data.Aviation.Metar.METARResultT.METARResultT f)
+ Data.Aviation.Metar.METARResultT: instance Data.Functor.Classes.Eq1 f => Data.Functor.Classes.Eq1 (Data.Aviation.Metar.METARResultT.METARResultT f)
+ Data.Aviation.Metar.METARResultT: instance Data.Functor.Classes.Show1 f => Data.Functor.Classes.Show1 (Data.Aviation.Metar.METARResultT.METARResultT f)
+ Data.Aviation.Metar.METARResultT: instance Data.Functor.Extend.Extend f => Data.Functor.Extend.Extend (Data.Aviation.Metar.METARResultT.METARResultT f)
+ Data.Aviation.Metar.METARResultT: instance Data.Traversable.Traversable f => Data.Traversable.Traversable (Data.Aviation.Metar.METARResultT.METARResultT f)
+ Data.Aviation.Metar.METARResultT: instance GHC.Base.Functor f => GHC.Base.Functor (Data.Aviation.Metar.METARResultT.METARResultT f)
+ Data.Aviation.Metar.METARResultT: instance GHC.Base.Monad f => Data.Functor.Alt.Alt (Data.Aviation.Metar.METARResultT.METARResultT f)
+ Data.Aviation.Metar.METARResultT: instance GHC.Base.Monad f => Data.Functor.Bind.Class.Apply (Data.Aviation.Metar.METARResultT.METARResultT f)
+ Data.Aviation.Metar.METARResultT: instance GHC.Base.Monad f => Data.Functor.Bind.Class.Bind (Data.Aviation.Metar.METARResultT.METARResultT f)
+ Data.Aviation.Metar.METARResultT: instance GHC.Base.Monad f => GHC.Base.Applicative (Data.Aviation.Metar.METARResultT.METARResultT f)
+ Data.Aviation.Metar.METARResultT: instance GHC.Base.Monad f => GHC.Base.Monad (Data.Aviation.Metar.METARResultT.METARResultT f)
+ Data.Aviation.Metar.METARResultT: instance GHC.Base.Monad f => GHC.Base.Semigroup (Data.Aviation.Metar.METARResultT.METARResultT f a)
+ Data.Aviation.Metar.METARResultT: mETARResultT :: HasMETARResultT c f a => Lens' c (METARResultT f a)
+ Data.Aviation.Metar.METARResultT: newtype METARResultT (f :: Type -> Type) a
- Data.Aviation.Metar: getNOAAMETAR :: String -> TAFResultT IO String
+ Data.Aviation.Metar: getNOAAMETAR :: String -> METARResultT IO String
Files
- changelog.md +8/−0
- metar.cabal +21/−25
- src/Data/Aviation/Metar.hs +15/−104
- src/Data/Aviation/Metar/BOMTAFResult.hs +0/−22
- src/Data/Aviation/Metar/METARResult.hs +96/−0
- src/Data/Aviation/Metar/METARResultT.hs +121/−0
- src/Data/Aviation/Metar/TAFResult.hs +0/−110
- src/Data/Aviation/Metar/TAFResultT.hs +0/−120
changelog.md view
@@ -1,3 +1,11 @@+0.0.4++* **BREAKING**: Removed BOM (Bureau of Meteorology) support - NOAA only+* **BREAKING**: Removed functions: `getBOMTAF`, `getAllMETAR`, `getAllTAF`+* **BREAKING**: Removed module: `Data.Aviation.Metar.BOMTAFResult`+* Updated for GHC 9.6.7 compatibility+* Relaxed dependency bounds+ 0.0.3 * tgftp.nws.noaa.gov moved to forcing https, so use wreq library
metar.cabal view
@@ -1,16 +1,16 @@ name: metar-version: 0.0.3+version: 0.0.4 license: BSD3 license-file: LICENCE author: Tony Morris <ʇǝu˙sıɹɹoɯʇ@sıɹɹoɯʇ> maintainer: Tony Morris <ʇǝu˙sıɹɹoɯʇ@sıɹɹoɯʇ>-copyright: Copyright (c) 2018, Tony Morris-synopsis: Australian METAR+copyright: Copyright (c) 2018-2026, Tony Morris+synopsis: METAR from NOAA category: Data, Aviation-description: - Obtain Australian METAR from Bureau of Meteorology (BOM).+description:+ Obtain METAR observations from NOAA. .- If that fails, get the METAR from NOAA.+ Supports ICAO airport codes available in the NOAA database. . <<https://i.imgur.com/VGTogB8.gif>> homepage: https://github.com/tonymorris/metar@@ -29,17 +29,14 @@ build-depends: base >= 4.8 && < 5- , bytestring >= 0.10 && < 0.11- , http-client >= 0.5 && < 0.6+ , bytestring >= 0.10 && < 0.13+ , http-client >= 0.5 && < 0.8 , HTTP >= 4000 && < 5000- , lens >= 4 && < 5- , network-uri >= 2.6 && < 3- , semigroups >= 0.9 && < 0.19- , semigroupoids >= 5.2 && < 6- , tagsoup >= 0.13 && < 0.15- , tagsoup-selection >= 0.1 && < 0.2- , transformers >= 0.5 && < 0.6- , deriving-compat >= 0.5 && < 0.6+ , lens >= 4 && < 6+ , semigroups >= 0.9 && < 0.21+ , semigroupoids >= 5.2 && < 7+ , transformers >= 0.5 && < 0.7+ , deriving-compat >= 0.5 && < 0.7 , wreq >= 0.5 && < 0.6 ghc-options:@@ -54,9 +51,8 @@ exposed-modules: Data.Aviation.Metar- , Data.Aviation.Metar.BOMTAFResult- , Data.Aviation.Metar.TAFResult- , Data.Aviation.Metar.TAFResultT+ , Data.Aviation.Metar.METARResult+ , Data.Aviation.Metar.METARResultT executable metar main-is:@@ -80,14 +76,14 @@ test-suite tests - build-depends: QuickCheck >=2.9.2 && <2.13+ build-depends: QuickCheck >=2.9.2 , base >=4.8 && < 5- , checkers >=0.4.6 && <0.5+ , checkers >=0.4.6 , metar- , lens >=4 && <4.18- , tasty >=0.11 && <1.2- , tasty-hunit >=0.9 && <0.11- , tasty-quickcheck >=0.8.4 && <0.11+ , lens >=4+ , tasty >=0.11+ , tasty-hunit >=0.9+ , tasty-quickcheck >=0.8.4 type: exitcode-stdio-1.0
src/Data/Aviation/Metar.hs view
@@ -3,10 +3,7 @@ {-# LANGUAGE CPP #-} module Data.Aviation.Metar(- getBOMTAF-, getNOAAMETAR-, getAllMETAR-, getAllTAF+ getNOAAMETAR , runMETAR ) where @@ -15,104 +12,27 @@ import Control.Exception(catch) import Control.Lens(view, _Wrapped, (&), (.~), (^.)) import Control.Monad(Monad((>>=)))-import Data.Aviation.Metar.BOMTAFResult(BOMTAFResponse(BOMTAFResponse), bomMETAR, bomTAF)-import Data.Aviation.Metar.TAFResult(TAFResult(ConnErrorResult, ParseErrorResult, TAFResultValue))-import Data.Aviation.Metar.TAFResultT(TAFResultT(TAFResultT))+import Data.Aviation.Metar.METARResult(METARResult(ConnErrorResult, ParseErrorResult, METARResultValue))+import Data.Aviation.Metar.METARResultT(METARResultT(METARResultT)) import Data.ByteString.Lazy(ByteString)-import Data.ByteString.Lazy.Char8(unpack)+import qualified Data.ByteString.Lazy.Char8 as BS import Data.Char(toUpper) import Data.Either(Either(Left, Right))-import Data.Foldable(length) import Data.Function(($)) import Data.Functor(fmap)-import Data.List(intercalate) import Data.Maybe(Maybe(Nothing, Just))-import Data.String(String, lines)+import Data.String(String) import Data.Semigroup((<>))-import Network.HTTP(Request, Response, setHeaders, setRequestBody, mkRequest, RequestMethod(POST), Header(Header), HeaderName(..), rspBody, simpleHTTP) import Network.HTTP.Client(HttpException) import Network.Stream(ConnError(ErrorMisc))-import Network.URI(URI(URI), URIAuth(URIAuth)) import Network.Wreq(getWith, defaults, headers, Options, responseBody) import qualified Network.Wreq as Wreq(Response) import Prelude(show) import System.IO(IO, hPutStrLn, putStrLn, stderr)-import Text.HTML.TagSoup(Tag(TagText))-import Text.HTML.TagSoup.Tree(TagTree(TagBranch, TagLeaf), parseTree) -withResult ::- (r -> Maybe a) ->- Either ConnError r ->- TAFResult a-withResult _ (Left e) =- ConnErrorResult e-withResult k (Right s) =- case k s of- Nothing ->- ParseErrorResult- Just z ->- TAFResultValue z--getBOMTAF ::- String- -> TAFResultT IO BOMTAFResponse-getBOMTAF =- let mkTAFResponse ::- [TagTree String]- -> Maybe BOMTAFResponse- mkTAFResponse (TagBranch "h3" [] [TagLeaf (TagText title)] : TagBranch "p" [("class","product")] tafs : TagBranch "p" [("class","product")] metars:_) =- let tagTexts q =- q >>= \r ->- case r of- TagLeaf (TagText v) ->- [v]- _ ->- []- in Just (BOMTAFResponse title (tagTexts tafs) (tagTexts metars))- mkTAFResponse _ =- Nothing- request ::- String- -> Request String- request yxxx =- let reqBody =- "keyword=" <> yxxx <> "&type=search&page=TAF"- in setHeaders- (- setRequestBody- (- mkRequest- POST- (URI "http" (Just (URIAuth "" "www.bom.gov.au" "")) "/aviation/php/process.php" "" "")- )- ("application/x-www-form-urlencoded", reqBody)- )- [- Header HdrHost "www.bom.gov.au"- , Header HdrUserAgent "tonymorris/metar"- , Header HdrAccept "*/*"- , Header HdrAcceptLanguage "en-US,en;q=0.5"- , Header HdrAcceptEncoding "text/html"- , Header HdrReferer "http://www.bom.gov.au/aviation/forecasts/taf/"- , Header HdrConnection "keep-alive"- , Header HdrContentType "application/x-www-form-urlencoded"- , Header HdrContentLength (show (length reqBody))- , Header HdrCookie "check=ok; bom_meteye_windspeed_units_knots=yes"- , Header HdrPragma "no-cache"- , Header HdrCacheControl "no-cache"- , Header (HdrCustom "DNT") "1"- , Header (HdrCustom "X-Requested-With") "XMLHttpRequest"- ]- respTAF ::- Response String- -> Maybe BOMTAFResponse- respTAF =- mkTAFResponse . parseTree . rspBody- in TAFResultT . fmap (withResult respTAF) . simpleHTTP . request- getNOAAMETAR :: String- -> TAFResultT IO String+ -> METARResultT IO String getNOAAMETAR = let options :: Options@@ -165,23 +85,14 @@ Wreq.Response ByteString -> Maybe String respMETAR r =- case lines . unpack $ r ^. responseBody of- [_, r'] -> Just r'+ case BS.lines (r ^. responseBody) of+ [_, r'] -> Just (BS.unpack r') _ -> Nothing- in TAFResultT . fmap (withResult respMETAR) . request--getAllMETAR ::- String- -> TAFResultT IO [String]-getAllMETAR x = - fmap (view bomMETAR) (getBOMTAF x) <>- fmap pure (getNOAAMETAR x)--getAllTAF ::- String- -> TAFResultT IO [String]-getAllTAF x = - fmap (view bomTAF) (getBOMTAF x)+ in METARResultT . fmap (\result -> case result of+ Left e -> ConnErrorResult e+ Right response -> case respMETAR response of+ Nothing -> ParseErrorResult+ Just metar -> METARResultValue metar) . request runMETAR :: [String]@@ -194,10 +105,10 @@ do putStrLn ("metar version " <> VERSION_metar) stderr' "enter an argument (ICAO code)" (r:_) ->- let s = view _Wrapped (fmap (intercalate "\n") (getAllMETAR r))+ let s = view _Wrapped (getNOAAMETAR r) in s >>= \s' -> case s' of- TAFResultValue a ->+ METARResultValue a -> putStrLn a ParseErrorResult -> stderr' ("No METAR for " <> r)
− src/Data/Aviation/Metar/BOMTAFResult.hs
@@ -1,22 +0,0 @@-{-# LANGUAGE NoImplicitPrelude #-}-{-# LANGUAGE TemplateHaskell #-}--module Data.Aviation.Metar.BOMTAFResult where--import Control.Lens(makeClassy)-import Data.Eq(Eq)-import Data.Ord(Ord)-import Data.String(String)-import Prelude(Show)--data BOMTAFResponse =- BOMTAFResponse {- _bomTitle ::- String- , _bomTAF ::- [String]- , _bomMETAR ::- [String]- } deriving (Eq, Ord, Show)--makeClassy ''BOMTAFResponse
+ src/Data/Aviation/Metar/METARResult.hs view
@@ -0,0 +1,96 @@+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE FlexibleInstances #-}++module Data.Aviation.Metar.METARResult where++import Control.Applicative(Applicative(pure, (<*>)))+import Control.Lens(makeClassy, makeClassyPrisms)+import Control.Monad(Monad(return, (>>=)))+import Data.Eq(Eq)+import Data.Eq.Deriving(deriveEq1)+import Data.Foldable(Foldable(foldr))+import Data.Functor(Functor(fmap), (<$>))+import Data.Functor.Apply(Apply((<.>)))+import Data.Functor.Bind(Bind((>>-)))+import Data.Functor.Extend(Extend(duplicated))+import Data.Traversable(Traversable(traverse))+import Network.Stream(ConnError)+import Prelude(Show)+import Text.Show.Deriving(deriveShow1)++data METARResult a =+ ConnErrorResult ConnError+ | ParseErrorResult+ | METARResultValue a+ deriving (Eq, Show)++makeClassy ''METARResult+makeClassyPrisms ''METARResult+deriveEq1 ''METARResult+deriveShow1 ''METARResult++instance Functor METARResult where+ fmap _ (ConnErrorResult e) =+ ConnErrorResult e+ fmap _ ParseErrorResult =+ ParseErrorResult+ fmap f (METARResultValue a) =+ METARResultValue (f a)++instance Apply METARResult where+ ConnErrorResult e <.> _ =+ ConnErrorResult e+ ParseErrorResult <.> _ =+ ParseErrorResult+ METARResultValue f <.> METARResultValue a =+ METARResultValue (f a)+ METARResultValue _ <.> ConnErrorResult e =+ ConnErrorResult e+ METARResultValue _ <.> ParseErrorResult =+ ParseErrorResult++instance Applicative METARResult where+ pure =+ METARResultValue+ (<*>) =+ (<.>)++instance Bind METARResult where+ ConnErrorResult e >>- _ =+ ConnErrorResult e+ ParseErrorResult >>- _ =+ ParseErrorResult+ METARResultValue a >>- f =+ f a++instance Monad METARResult where+ return =+ pure+ (>>=) =+ (>>-)++instance Foldable METARResult where+ foldr f z (METARResultValue a) =+ f a z+ foldr _ z (ConnErrorResult _ ) =+ z+ foldr _ z ParseErrorResult =+ z++instance Traversable METARResult where+ traverse f (METARResultValue a) =+ METARResultValue <$> f a+ traverse _ (ConnErrorResult e) =+ pure (ConnErrorResult e)+ traverse _ ParseErrorResult =+ pure ParseErrorResult++instance Extend METARResult where+ duplicated (METARResultValue a) =+ METARResultValue (METARResultValue a)+ duplicated (ConnErrorResult e) =+ ConnErrorResult e+ duplicated ParseErrorResult =+ ParseErrorResult
+ src/Data/Aviation/Metar/METARResultT.hs view
@@ -0,0 +1,121 @@+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}++module Data.Aviation.Metar.METARResultT where++import Control.Applicative(Applicative(pure, (<*>)))+import Control.Category((.))+import Control.Monad(Monad(return, (>>=)), ap)+import Data.Aviation.Metar.METARResult(METARResult(METARResultValue, ConnErrorResult, ParseErrorResult))+import Data.Eq(Eq((==)))+import Data.Foldable(Foldable(foldr))+import Data.Functor(Functor(fmap), (<$>))+import Data.Functor.Alt(Alt((<!>)))+import Data.Functor.Apply(Apply((<.>)))+import Data.Functor.Bind(Bind((>>-)))+import Data.Functor.Classes(Eq1, Show1, eq1, showsPrec1)+import Data.Functor.Extend(Extend(duplicated))+import Data.Ord((>))+import Data.Semigroup(Semigroup((<>)))+import Control.Lens hiding ((<.>))+import Control.Monad.IO.Class(MonadIO(liftIO))+import Control.Monad.Trans.Class(MonadTrans(lift))+import Data.Eq.Deriving(deriveEq1)+import Prelude(Show(showsPrec), showParen, showString)+import Text.Show.Deriving(deriveShow1)++newtype METARResultT f a =+ METARResultT+ (f (METARResult a))++makeClassy ''METARResultT+makeWrapped ''METARResultT++instance (Eq a, Eq1 f) => Eq (METARResultT f a) where+ METARResultT x == METARResultT y =+ eq1 x y++instance (Show a, Show1 f) => Show (METARResultT f a) where+ showsPrec n (METARResultT x) =+ showParen (n > 10) (showString "TafResultT " . showsPrec1 n x)++deriveEq1 ''METARResultT+deriveShow1 ''METARResultT++instance Functor f => Functor (METARResultT f) where+ fmap f (METARResultT x) =+ METARResultT (fmap (fmap f) x)++instance Monad f => Apply (METARResultT f) where+ (<.>) =+ ap++instance Monad f => Applicative (METARResultT f) where+ pure =+ METARResultT . pure . pure+ (<*>) =+ ap++instance Monad f => Bind (METARResultT f) where+ (>>-) =+ (>>=)++instance Monad f => Monad (METARResultT f) where+ return =+ pure+ METARResultT x >>= f =+ METARResultT+ (+ x >>= \x' ->+ case x' of+ METARResultValue x'' ->+ let METARResultT r = f x''+ in r+ ConnErrorResult e ->+ pure (ConnErrorResult e)+ ParseErrorResult ->+ pure ParseErrorResult+ )++instance Foldable f => Foldable (METARResultT f) where+ foldr f z (METARResultT x) =+ foldr (\a b -> foldr f b a) z x++instance Traversable f => Traversable (METARResultT f) where+ traverse f (METARResultT x) =+ METARResultT <$> traverse (traverse f) x++instance Monad f => Alt (METARResultT f) where+ METARResultT x <!> METARResultT y =+ METARResultT+ (+ x >>= \x' ->+ case x' of+ METARResultValue x'' ->+ pure (METARResultValue x'')+ ConnErrorResult _ ->+ y+ ParseErrorResult ->+ y+ )++instance Extend f => Extend (METARResultT f) where+ duplicated (METARResultT x) =+ METARResultT (fmap (METARResultValue . METARResultT) (duplicated x))++instance MonadIO f => MonadIO (METARResultT f) where+ liftIO =+ METARResultT . liftIO . fmap pure++instance MonadTrans METARResultT where+ lift =+ METARResultT . fmap pure++instance Monad f => Semigroup (METARResultT f a) where+ (<>) =+ (<!>)
− src/Data/Aviation/Metar/TAFResult.hs
@@ -1,110 +0,0 @@-{-# LANGUAGE NoImplicitPrelude #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE FlexibleInstances #-}--module Data.Aviation.Metar.TAFResult where--import Control.Applicative(Applicative(pure, (<*>)))-import Control.Lens(makeClassy, makeClassyPrisms)-import Control.Monad(Monad(return, (>>=)))-import Data.Eq(Eq)-import Data.Eq.Deriving(deriveEq1)-import Data.Foldable(Foldable(foldr))-import Data.Functor(Functor(fmap), (<$>))-import Data.Functor.Alt(Alt((<!>)))-import Data.Functor.Apply(Apply((<.>)))-import Data.Functor.Bind(Bind((>>-)))-import Data.Functor.Extend(Extend(duplicated))-import Data.Semigroup(Semigroup((<>)))-import Data.Traversable(Traversable(traverse))-import Network.Stream(ConnError)-import Prelude(Show)-import Text.Show.Deriving(deriveShow1)--data TAFResult a =- ConnErrorResult ConnError- | ParseErrorResult- | TAFResultValue a- deriving (Eq, Show)--makeClassy ''TAFResult-makeClassyPrisms ''TAFResult-deriveEq1 ''TAFResult-deriveShow1 ''TAFResult--instance Functor TAFResult where- fmap _ (ConnErrorResult e) =- ConnErrorResult e- fmap _ ParseErrorResult =- ParseErrorResult- fmap f (TAFResultValue a) =- TAFResultValue (f a)--instance Apply TAFResult where- ConnErrorResult e <.> _ =- ConnErrorResult e- ParseErrorResult <.> _ =- ParseErrorResult- TAFResultValue f <.> TAFResultValue a =- TAFResultValue (f a)- TAFResultValue _ <.> ConnErrorResult e =- ConnErrorResult e- TAFResultValue _ <.> ParseErrorResult =- ParseErrorResult--instance Applicative TAFResult where- pure =- TAFResultValue- (<*>) =- (<.>)--instance Bind TAFResult where- ConnErrorResult e >>- _ =- ConnErrorResult e- ParseErrorResult >>- _ =- ParseErrorResult- TAFResultValue a >>- f =- f a--instance Monad TAFResult where- return =- pure- (>>=) =- (>>-)--instance Foldable TAFResult where- foldr f z (TAFResultValue a) =- f a z- foldr _ z (ConnErrorResult _ ) =- z- foldr _ z ParseErrorResult =- z--instance Traversable TAFResult where- traverse f (TAFResultValue a) =- TAFResultValue <$> f a- traverse _ (ConnErrorResult e) =- pure (ConnErrorResult e)- traverse _ ParseErrorResult =- pure ParseErrorResult--instance Alt TAFResult where- TAFResultValue a <!> _ =- TAFResultValue a- ConnErrorResult _ <!> x =- x- ParseErrorResult <!> x =- x--instance Extend TAFResult where- duplicated (TAFResultValue a) =- TAFResultValue (TAFResultValue a)- duplicated (ConnErrorResult e) =- ConnErrorResult e- duplicated ParseErrorResult =- ParseErrorResult--instance Semigroup (TAFResult a) where- (<>) =- (<!>)
− src/Data/Aviation/Metar/TAFResultT.hs
@@ -1,120 +0,0 @@-{-# LANGUAGE NoImplicitPrelude #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE TypeFamilies #-}--module Data.Aviation.Metar.TAFResultT where--import Control.Applicative(Applicative(pure, (<*>)))-import Control.Category((.))-import Control.Monad(Monad(return, (>>=)), ap)-import Data.Aviation.Metar.TAFResult(TAFResult(TAFResultValue, ConnErrorResult, ParseErrorResult))-import Data.Eq(Eq((==)))-import Data.Foldable(Foldable(foldr))-import Data.Functor(Functor(fmap), (<$>))-import Data.Functor.Alt(Alt((<!>)))-import Data.Functor.Apply(Apply((<.>)))-import Data.Functor.Bind(Bind((>>-)))-import Data.Functor.Classes(Eq1, Show1, eq1, showsPrec1)-import Data.Functor.Extend(Extend(duplicated))-import Data.Ord((>))-import Data.Semigroup(Semigroup((<>)))-import Control.Lens hiding ((<.>))-import Control.Monad.IO.Class(MonadIO(liftIO))-import Control.Monad.Trans.Class(MonadTrans(lift))-import Data.Eq.Deriving(deriveEq1)-import Prelude(Show(showsPrec), showParen, showString)-import Text.Show.Deriving(deriveShow1)--newtype TAFResultT f a =- TAFResultT- (f (TAFResult a))--makeClassy ''TAFResultT-makeWrapped ''TAFResultT--instance (Eq a, Eq1 f) => Eq (TAFResultT f a) where- TAFResultT x == TAFResultT y =- eq1 x y--instance (Show a, Show1 f) => Show (TAFResultT f a) where- showsPrec n (TAFResultT x) =- showParen (n > 10) (showString "TafResultT " . showsPrec1 n x)--deriveEq1 ''TAFResultT-deriveShow1 ''TAFResultT--instance Functor f => Functor (TAFResultT f) where- fmap f (TAFResultT x) =- TAFResultT (fmap (fmap f) x)--instance Monad f => Apply (TAFResultT f) where- (<.>) =- ap--instance Monad f => Applicative (TAFResultT f) where- pure =- TAFResultT . pure . pure- (<*>) =- ap--instance Monad f => Bind (TAFResultT f) where- (>>-) =- (>>=)--instance Monad f => Monad (TAFResultT f) where- return =- pure- TAFResultT x >>= f =- TAFResultT- (- x >>= \x' ->- case x' of- TAFResultValue x'' ->- let TAFResultT r = f x''- in r- ConnErrorResult e ->- pure (ConnErrorResult e)- ParseErrorResult ->- pure ParseErrorResult- )--instance Foldable f => Foldable (TAFResultT f) where- foldr f z (TAFResultT x) =- foldr (\a b -> foldr f b a) z x--instance Traversable f => Traversable (TAFResultT f) where- traverse f (TAFResultT x) =- TAFResultT <$> traverse (traverse f) x--instance Monad f => Alt (TAFResultT f) where- TAFResultT x <!> TAFResultT y =- TAFResultT- (- x >>= \x' ->- case x' of- TAFResultValue x'' ->- pure (TAFResultValue x'')- ConnErrorResult _ ->- y- ParseErrorResult ->- y- )--instance Extend f => Extend (TAFResultT f) where- duplicated (TAFResultT x) =- TAFResultT (fmap (TAFResultValue . TAFResultT) (duplicated x))--instance MonadIO f => MonadIO (TAFResultT f) where- liftIO =- TAFResultT . liftIO . fmap pure--instance MonadTrans TAFResultT where- lift =- TAFResultT . fmap pure--instance Monad f => Semigroup (TAFResultT f a) where- (<>) =- (<!>)