diff options
author | Profpatsch <mail@profpatsch.de> | 2023-04-08T10·59+0200 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2023-04-08T12·25+0000 |
commit | 5e400b5b2478fa59a84cc9a69c525ada4be6f0c3 (patch) | |
tree | 26af770cb195e20f27289a0c9c5098cca6122e1b | |
parent | 6edc2182d113f325d6990684b750707e60123e58 (diff) |
chore(users/Profpatsch): bring reverse-haskell-deps into shape r/6078
Add a cabal file and move into subdir. Use MyPrelude & fix a few linter warnings. Change-Id: I19d5ba47be789fc24f8e02ee8721f73c706ae3e9 Reviewed-on: https://cl.tvl.fyi/c/depot/+/8465 Reviewed-by: Profpatsch <mail@profpatsch.de> Autosubmit: Profpatsch <mail@profpatsch.de> Tested-by: BuildkiteCI
-rw-r--r-- | users/Profpatsch/reverse-haskell-deps/ReverseHaskellDeps.hs (renamed from users/Profpatsch/reverse-haskell-deps.hs) | 72 | ||||
-rw-r--r-- | users/Profpatsch/reverse-haskell-deps/default.nix (renamed from users/Profpatsch/reverse-haskell-deps.nix) | 3 | ||||
-rw-r--r-- | users/Profpatsch/reverse-haskell-deps/reverse-haskell-deps.cabal | 16 | ||||
-rw-r--r-- | users/Profpatsch/shell.nix | 1 |
4 files changed, 57 insertions, 35 deletions
diff --git a/users/Profpatsch/reverse-haskell-deps.hs b/users/Profpatsch/reverse-haskell-deps/ReverseHaskellDeps.hs index 6b644df9ecc6..0e18ce8a6b37 100644 --- a/users/Profpatsch/reverse-haskell-deps.hs +++ b/users/Profpatsch/reverse-haskell-deps/ReverseHaskellDeps.hs @@ -1,72 +1,76 @@ {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} -import qualified Text.HTML.TagSoup as Tag -import qualified Data.Text as Text -import Data.Text (Text) -import qualified Data.List as List + +module Main where + +import Data.ByteString qualified as ByteString +import Data.Either +import Data.List qualified as List import Data.Maybe -import Text.Nicify -import qualified Text.Read as Read +import Data.Text (Text) +import Data.Text qualified as Text +import Data.Text.Encoding qualified +import MyPrelude import Numeric.Natural -import Data.Either -import qualified Data.ByteString as ByteString -import qualified Data.Text.Encoding +import Text.HTML.TagSoup qualified as Tag +import Text.Nicify +import Text.Read qualified as Read -parseNat :: Text.Text -> Maybe Natural -parseNat = Read.readMaybe . Text.unpack +parseNat :: Text -> Maybe Natural +parseNat = Read.readMaybe . textToString printNice :: Show a => a -> IO () printNice = putStrLn . nicify . show -type Tag = Tag.Tag Text.Text +type Tag = Tag.Tag Text main = do reverseHtml <- readStdinUtf8 printNice $ List.sortOn snd $ packagesAndReverseDeps reverseHtml - where - readStdinUtf8 = Data.Text.Encoding.decodeUtf8 <$> ByteString.getContents + readStdinUtf8 = bytesToTextUtf8Lenient <$> ByteString.getContents -- | reads the table provided by https://packdeps.haskellers.com/reverse -- figuring out all sections (starting with the link to the package name), -- then figuring out the name of the package and the first column, -- which is the number of reverse dependencies of the package +packagesAndReverseDeps :: Text -> [(Text, Natural)] packagesAndReverseDeps reverseHtml = do let tags = Tag.parseTags reverseHtml - let sections = Tag.partitions (isJust . reverseLink) tags - let sectionNames = map (fromJust . reverseLink . head) sections + let sections = Tag.partitions (isJust . reverseLink) tags + let sectionName [] = "<unknown section>" + sectionName (sect : _) = sect & reverseLink & fromMaybe "<unknown section>" + let sectionNames = map sectionName sections mapMaybe - (\(name :: Text.Text, sect) -> do + ( \(name :: Text, sect) -> do reverseDeps <- firstNaturalNumber sect - pure (sectionPackageName name sect, reverseDeps) :: Maybe (Text.Text, Natural)) + pure (sectionPackageName name sect, reverseDeps) :: Maybe (Text, Natural) + ) $ zip sectionNames sections - - where reverseLink = \case - Tag.TagOpen "a" attrs -> mapFind attrReverseLink attrs + Tag.TagOpen "a" attrs -> findMaybe attrReverseLink attrs _ -> Nothing attrReverseLink = \case - ("href", lnk) -> if - | "packdeps.haskellers.com/reverse/" `Text.isInfixOf` lnk -> Just lnk - | otherwise -> Nothing + ("href", lnk) -> + if + | "packdeps.haskellers.com/reverse/" `Text.isInfixOf` lnk -> Just lnk + | otherwise -> Nothing _ -> Nothing sectionPackageName :: Text -> [Tag] -> Text sectionPackageName sectionName = \case - (_: Tag.TagText name : _) -> name - (_: el : _) -> sectionName + (_ : Tag.TagText name : _) -> name + (_ : el : _) -> sectionName xs -> sectionName - firstNaturalNumber :: [Tag] -> Maybe Natural firstNaturalNumber = - mapFind (\case - Tag.TagText t -> parseNat t - _ -> Nothing) - - mapFind :: (a -> Maybe b) -> [a] -> Maybe b - mapFind f xs = fromJust . f <$> List.find (isJust . f) xs + findMaybe + ( \case + Tag.TagText t -> parseNat t + _ -> Nothing + ) diff --git a/users/Profpatsch/reverse-haskell-deps.nix b/users/Profpatsch/reverse-haskell-deps/default.nix index 6df7bc6329cd..704b7f229b59 100644 --- a/users/Profpatsch/reverse-haskell-deps.nix +++ b/users/Profpatsch/reverse-haskell-deps/default.nix @@ -19,12 +19,13 @@ let rev-hs = pkgs.writers.writeHaskell "revers-haskell-deps-hs" { libraries = [ + depot.users.Profpatsch.my-prelude pkgs.haskellPackages.nicify-lib pkgs.haskellPackages.tagsoup ]; } - ./reverse-haskell-deps.hs; + ./ReverseHaskellDeps.hs; in diff --git a/users/Profpatsch/reverse-haskell-deps/reverse-haskell-deps.cabal b/users/Profpatsch/reverse-haskell-deps/reverse-haskell-deps.cabal new file mode 100644 index 000000000000..d8dd5cbe5a6e --- /dev/null +++ b/users/Profpatsch/reverse-haskell-deps/reverse-haskell-deps.cabal @@ -0,0 +1,16 @@ +cabal-version: 2.4 +name: reverse-haskell-deps +version: 0.1.0.0 +author: Profpatsch +maintainer: mail@profpatsch.de + +library + exposed-modules: ReverseHaskellDeps.hs + + build-depends: + base >=4.15 && <5, + my-prelude, + tagsoup, + nicify-lib + + default-language: Haskell2010 diff --git a/users/Profpatsch/shell.nix b/users/Profpatsch/shell.nix index 499109ec3701..3420bcdb0ace 100644 --- a/users/Profpatsch/shell.nix +++ b/users/Profpatsch/shell.nix @@ -29,6 +29,7 @@ pkgs.mkShell { h.nonempty-containers h.deriving-compat h.unix + h.tagsoup h.attoparsec h.iCalendar h.case-insensitive |