diff options
| -rw-r--r-- | app/much.hs | 9 | ||||
| -rw-r--r-- | much.cabal | 4 | ||||
| -rw-r--r-- | src/Blessings/String/Extra.hs | 1 | ||||
| -rw-r--r-- | src/Data/Aeson/Extends.hs | 7 | ||||
| -rw-r--r-- | src/Much/API.hs | 6 | ||||
| -rw-r--r-- | src/Much/Action.hs | 13 | ||||
| -rw-r--r-- | src/Much/Config.hs | 8 | ||||
| -rw-r--r-- | src/Much/Core.hs | 16 | ||||
| -rw-r--r-- | src/Much/MBox.hs | 44 | ||||
| -rw-r--r-- | src/Much/MappedSets.hs | 12 | ||||
| -rw-r--r-- | src/Much/ParseMail.hs | 28 | ||||
| -rw-r--r-- | src/Much/RenderTreeView.hs | 19 | ||||
| -rw-r--r-- | src/Much/Screen.hs | 1 | ||||
| -rw-r--r-- | src/Much/State.hs | 18 | ||||
| -rw-r--r-- | src/Much/TagUtils.hs | 8 | ||||
| -rw-r--r-- | src/Much/TreeView.hs | 9 | ||||
| -rw-r--r-- | src/Much/TreeView/Types.hs | 6 | ||||
| -rw-r--r-- | src/Network/Mail/Mime.hs | 36 | ||||
| -rw-r--r-- | src/Notmuch.hs | 16 | ||||
| -rw-r--r-- | src/Notmuch/Message.hs | 16 | ||||
| -rw-r--r-- | src/Notmuch/SearchResult.hs | 2 |
21 files changed, 132 insertions, 147 deletions
diff --git a/app/much.hs b/app/much.hs index 84eda6b..87d73c0 100644 --- a/app/much.hs +++ b/app/much.hs @@ -1,4 +1,3 @@ -{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} @@ -7,19 +6,19 @@ module Main (main) where import Blessings.String.WCWidth import Data.Default import Data.Maybe +import Data.Tree qualified as Tree +import Data.Tree.Zipper qualified as Z +import Much.API qualified import Much.Action import Much.Core import Much.State import Much.TreeView +import Notmuch.Message qualified as Notmuch import Scanner import System.Environment (getEnv) import System.IO.Unsafe (unsafePerformIO) import Text.Hyphenation import Text.LineBreak -import qualified Data.Tree as Tree -import qualified Data.Tree.Zipper as Z -import qualified Much.API -import qualified Notmuch.Message as Notmuch scrollLines :: Int @@ -14,7 +14,7 @@ executable much import: common-stuff hs-source-dirs: app main-is: much.hs - default-language: Haskell2010 + default-language: GHC2024 ghc-options: -O2 -threaded -with-rtsopts=-N build-depends: much , base @@ -105,5 +105,5 @@ library , vector , wai , warp - default-language: Haskell2010 + default-language: GHC2024 ghc-options: -O2 -Wall diff --git a/src/Blessings/String/Extra.hs b/src/Blessings/String/Extra.hs index 51d13eb..74c4ef0 100644 --- a/src/Blessings/String/Extra.hs +++ b/src/Blessings/String/Extra.hs @@ -1,4 +1,3 @@ -{-# LANGUAGE LambdaCase #-} module Blessings.String.Extra where import Blessings diff --git a/src/Data/Aeson/Extends.hs b/src/Data/Aeson/Extends.hs index d78f81d..2905e60 100644 --- a/src/Data/Aeson/Extends.hs +++ b/src/Data/Aeson/Extends.hs @@ -1,10 +1,9 @@ module Data.Aeson.Extends (module Data.Aeson.Extends) where import Data.Aeson as Data.Aeson.Extends - -import qualified Data.ByteString.Lazy as LBS -import qualified Data.Text.Encoding.Error as TE -import qualified Data.Text.Lazy.Encoding as LT +import Data.ByteString.Lazy qualified as LBS +import Data.Text.Encoding.Error qualified as TE +import Data.Text.Lazy.Encoding qualified as LT eitherDecodeLenient' :: FromJSON a => LBS.ByteString -> Either String a diff --git a/src/Much/API.hs b/src/Much/API.hs index a9999ef..5ddf2c6 100644 --- a/src/Much/API.hs +++ b/src/Much/API.hs @@ -1,8 +1,4 @@ -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE TypeOperators #-} module Much.API (module Much.API) where @@ -11,6 +7,7 @@ import Control.Exception (catch, finally, throwIO) import Control.Monad.IO.Class import Data.Function ((&)) import Data.Proxy (Proxy) +import Data.Tree.Zipper qualified as Z import Much.API.Config as Much.API import Much.Event import Much.State @@ -23,7 +20,6 @@ import Notmuch.Message import Servant import System.IO.Error (isDoesNotExistError) import System.Posix.Files (removeLink) -import qualified Data.Tree.Zipper as Z type API = diff --git a/src/Much/Action.hs b/src/Much/Action.hs index d76e503..e798357 100644 --- a/src/Much/Action.hs +++ b/src/Much/Action.hs @@ -1,21 +1,22 @@ -{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} + module Much.Action where import Blessings.String.WCWidth import Data.Maybe import Data.Tree.Extra (setSubForest) -import Scanner +import Data.Tree.Zipper qualified as Z import Much.State import Much.TagUtils import Much.TreeSearch import Much.TreeView import Much.TreeZipperUtils -import qualified Data.Tree.Zipper as Z -import qualified Notmuch -import qualified Notmuch.Message as Notmuch -import qualified Notmuch.SearchResult as Notmuch +import Notmuch qualified +import Notmuch.Message qualified as Notmuch +import Notmuch.SearchResult qualified as Notmuch +import Scanner + displayKey :: String -> State -> IO State displayKey s q = return q { flashMessage = Plain $ show s } diff --git a/src/Much/Config.hs b/src/Much/Config.hs index 36f06bf..1aa8f44 100644 --- a/src/Much/Config.hs +++ b/src/Much/Config.hs @@ -1,11 +1,11 @@ -{-# LANGUAGE DeriveGeneric #-} module Much.Config where -import GHC.Generics (Generic) import Data.Aeson (FromJSON) +import Data.Map qualified as M +import Data.Text qualified as T +import GHC.Generics (Generic) import Much.State (ColorConfig) -import qualified Data.Text as T -import qualified Data.Map as M + data Config = Config { colorConfig :: Maybe (ColorConfig Maybe) diff --git a/src/Much/Core.hs b/src/Much/Core.hs index 1c8daa7..996d31b 100644 --- a/src/Much/Core.hs +++ b/src/Much/Core.hs @@ -1,19 +1,22 @@ -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} + module Much.Core where +import Blessings.Internal qualified as Blessings import Blessings.String.WCWidth (Blessings(Plain,SGR),pp) import Control.Concurrent import Control.Monad import Data.Aeson import Data.Functor import Data.Functor.Identity +import Data.Map qualified as M import Data.Maybe import Data.Time +import Data.Tree.Zipper qualified as Z import Much.API import Much.Action +import Much.Config qualified as Config import Much.Event import Much.RenderTreeView (renderTreeView) import Much.Screen @@ -21,18 +24,15 @@ import Much.State import Much.TreeSearch import Much.TreeView import Much.Utils +import Notmuch qualified import Options.Applicative import Scanner (scan,Scan(..)) +import System.Console.Terminal.Size qualified as Term import System.Environment import System.Exit import System.IO import System.Posix.Signals -import qualified Blessings.Internal as Blessings -import qualified Data.Map as M -import qualified Data.Tree.Zipper as Z -import qualified Much.Config as Config -import qualified Notmuch -import qualified System.Console.Terminal.Size as Term + importConfig :: Config.Config -> State -> State importConfig config state = state diff --git a/src/Much/MBox.hs b/src/Much/MBox.hs index 9299eea..5c7c0a6 100644 --- a/src/Much/MBox.hs +++ b/src/Much/MBox.hs @@ -1,5 +1,6 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} + module Much.MBox ( -- TODO don't re-export MBox but use our own Message type @@ -8,28 +9,27 @@ module Much.MBox , toForest ) where -import qualified Data.MBox as Export - -import Control.Applicative -import qualified Data.CaseInsensitive as CI -import qualified Data.List as List -import Data.Map.Strict (Map) -import qualified Data.Map.Strict as Map -import Data.Maybe -import Data.MBox -import Data.Ord -import Data.Set (Set) -import qualified Data.Set as Set -import Data.Text.Lazy (Text) -import Data.Time -import Data.Tree (Tree, Forest) -import qualified Data.Tree as Tree -import qualified MappedSets -import qualified Data.Text.Lazy as Text -import Safe -import System.Locale -import qualified Text.ParserCombinators.Parsec.Rfc2822 as P -import qualified Text.ParserCombinators.Parsec as P +import Control.Applicative +import Data.CaseInsensitive qualified as CI +import Data.List qualified as List +import Data.MBox +import Data.MBox qualified as Export +import Data.Map.Strict (Map) +import Data.Map.Strict qualified as Map +import Data.Maybe +import Data.Ord +import Data.Set (Set) +import Data.Set qualified as Set +import Data.Text.Lazy (Text) +import Data.Text.Lazy qualified as Text +import Data.Time +import Data.Tree (Tree, Forest) +import Data.Tree qualified as Tree +import MappedSets qualified +import Safe +import System.Locale +import Text.ParserCombinators.Parsec qualified as P +import Text.ParserCombinators.Parsec.Rfc2822 qualified as P type Ident = Text diff --git a/src/Much/MappedSets.hs b/src/Much/MappedSets.hs index ec0ae73..7db2279 100644 --- a/src/Much/MappedSets.hs +++ b/src/Much/MappedSets.hs @@ -1,11 +1,11 @@ module Much.MappedSets (invert, mk) where -import Control.Arrow -import Data.Map.Strict (Map) -import qualified Data.Map.Strict as Map -import Data.Maybe -import Data.Set (Set) -import qualified Data.Set as Set +import Control.Arrow +import Data.Map.Strict (Map) +import Data.Map.Strict qualified as Map +import Data.Maybe +import Data.Set (Set) +import Data.Set qualified as Set mk :: (Ord a, Ord b) => [(a, [b])] -> Map a (Set b) diff --git a/src/Much/ParseMail.hs b/src/Much/ParseMail.hs index d9bb733..6644db6 100644 --- a/src/Much/ParseMail.hs +++ b/src/Much/ParseMail.hs @@ -1,26 +1,24 @@ -{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} module Much.ParseMail (readMail) where -import qualified Data.Attoparsec.ByteString.Char8 as A8 -import qualified Data.ByteString as BS -import qualified Data.ByteString.Char8 as BS8 -import qualified Data.ByteString.Lazy as LBS -import qualified Data.CaseInsensitive as CI -import qualified Data.Text as T -import qualified Data.Text.Encoding as T -import qualified Data.Text.Lazy as LT -import qualified Data.Text.Lazy.Encoding as LT -import qualified Network.Email.Header.Parser as P -import qualified Network.Email.Header.Types as H -import qualified Network.Mail.Mime as M import Codec.MIME.Parse -import qualified Codec.MIME.QuotedPrintable as QP +import Codec.MIME.QuotedPrintable qualified as QP import Codec.MIME.Type import Control.Applicative +import Data.Attoparsec.ByteString.Char8 qualified as A8 +import Data.ByteString qualified as BS +import Data.ByteString.Char8 qualified as BS8 +import Data.ByteString.Lazy qualified as LBS +import Data.CaseInsensitive qualified as CI import Data.Char - +import Data.Text qualified as T +import Data.Text.Encoding qualified as T +import Data.Text.Lazy qualified as LT +import Data.Text.Lazy.Encoding qualified as LT +import Network.Email.Header.Parser qualified as P +import Network.Email.Header.Types qualified as H +import Network.Mail.Mime qualified as M -- TODO eventually we want our completely own Address, i.e. w/o M.Address diff --git a/src/Much/RenderTreeView.hs b/src/Much/RenderTreeView.hs index ea81fe2..21af597 100644 --- a/src/Much/RenderTreeView.hs +++ b/src/Much/RenderTreeView.hs @@ -1,30 +1,29 @@ -{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} module Much.RenderTreeView (renderTreeView) where -import qualified Notmuch.Message as Notmuch -import qualified Notmuch.SearchResult as Notmuch -import qualified Data.CaseInsensitive as CI -import qualified Data.List as L -import qualified Data.Map as M -import qualified Data.Text as T -import qualified Data.Tree.Zipper as Z -import qualified Much.TreeZipperUtils as Z import Blessings import Blessings.String.Extra (quoteSpecials) import Control.Arrow +import Data.CaseInsensitive qualified as CI import Data.Char -import Data.Function import Data.Functor.Identity +import Data.List qualified as L +import Data.Map qualified as M import Data.Maybe +import Data.Text qualified as T import Data.Time import Data.Time.Format.Human import Data.Tree +import Data.Tree.Zipper qualified as Z import Much.State import Much.TagUtils (Tag) import Much.TreeView +import Much.TreeZipperUtils qualified as Z +import Notmuch.Message qualified as Notmuch +import Notmuch.SearchResult qualified as Notmuch + color :: (ColorConfig Identity -> Identity Pm) -> ColorConfig Identity -> Blessings String -> Blessings String color key config = SGR $ runIdentity $ key config diff --git a/src/Much/Screen.hs b/src/Much/Screen.hs index 47bb90c..9d75728 100644 --- a/src/Much/Screen.hs +++ b/src/Much/Screen.hs @@ -1,4 +1,5 @@ {-# LANGUAGE RecordWildCards #-} + module Much.Screen (Screen(..), setScreen, withScreen) where import Control.Exception diff --git a/src/Much/State.hs b/src/Much/State.hs index a1de01f..c42460e 100644 --- a/src/Much/State.hs +++ b/src/Much/State.hs @@ -1,24 +1,24 @@ -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE OverloadedStrings #-} + module Much.State where import Blessings import Data.Aeson +import Data.CaseInsensitive qualified as CI import Data.Default import Data.Functor.Identity +import Data.Map qualified as M +import Data.Text qualified as T import Data.Time +import Data.Tree qualified as Tree +import Data.Tree.Zipper qualified as Z import GHC.Generics +import Much.API.Config qualified import Much.TreeView (TreeView(TVSearch)) +import Notmuch.Message qualified as Notmuch import Scanner import System.Posix.Signals -import qualified Data.CaseInsensitive as CI -import qualified Data.Map as M -import qualified Data.Text as T -import qualified Data.Tree as Tree -import qualified Data.Tree.Zipper as Z -import qualified Much.API.Config -import qualified Notmuch.Message as Notmuch + data State = State { cursor :: Z.TreePos Z.Full TreeView diff --git a/src/Much/TagUtils.hs b/src/Much/TagUtils.hs index d4e4d30..d6130e4 100644 --- a/src/Much/TagUtils.hs +++ b/src/Much/TagUtils.hs @@ -1,15 +1,13 @@ -{-# LANGUAGE LambdaCase #-} - module Much.TagUtils where -import qualified Data.Set as Set -import qualified Data.Text as T import Data.Char import Data.List.Split (wordsBy) +import Data.Set qualified as Set +import Data.Text qualified as T import Data.Tree +import Much.TreeView.Types import Notmuch.Message import Notmuch.SearchResult -import Much.TreeView.Types type Tag = T.Text diff --git a/src/Much/TreeView.hs b/src/Much/TreeView.hs index 9b309bc..3e94c8a 100644 --- a/src/Much/TreeView.hs +++ b/src/Much/TreeView.hs @@ -1,8 +1,6 @@ {-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE LambdaCase #-} {-# LANGUAGE RecordWildCards #-} - module Much.TreeView ( module Export , getMessage @@ -17,14 +15,13 @@ module Much.TreeView , hasUnloadedSubForest ) where - -import qualified Data.ByteString.Lazy.Char8 as LBS8 -import qualified Data.Text as T +import Data.ByteString.Lazy.Char8 qualified as LBS8 +import Data.Text qualified as T import Data.Tree +import Much.TreeView.Types as Export import Notmuch import Notmuch.Message import Notmuch.SearchResult -import Much.TreeView.Types as Export import System.Exit (ExitCode(ExitSuccess)) import System.Process.ByteString.Lazy (readProcessWithExitCode) diff --git a/src/Much/TreeView/Types.hs b/src/Much/TreeView/Types.hs index f30b0bc..28ed302 100644 --- a/src/Much/TreeView/Types.hs +++ b/src/Much/TreeView/Types.hs @@ -1,9 +1,7 @@ -{-# LANGUAGE LambdaCase #-} - module Much.TreeView.Types where -import qualified Data.CaseInsensitive as CI -import qualified Data.Text as T +import Data.CaseInsensitive qualified as CI +import Data.Text qualified as T import Notmuch.Message import Notmuch.SearchResult diff --git a/src/Network/Mail/Mime.hs b/src/Network/Mail/Mime.hs index 8fd9fe1..8c6f580 100644 --- a/src/Network/Mail/Mime.hs +++ b/src/Network/Mail/Mime.hs @@ -1,4 +1,5 @@ {-# LANGUAGE CPP, OverloadedStrings #-} + module Network.Mail.Mime ( -- * Datatypes Boundary (..) @@ -33,29 +34,30 @@ module Network.Mail.Mime , quotedPrintable ) where -import qualified Data.ByteString.Lazy as L -import Blaze.ByteString.Builder.Char.Utf8 import Blaze.ByteString.Builder -import System.Random +import Blaze.ByteString.Builder.Char.Utf8 import Control.Arrow -import System.Process -import System.IO -import System.Exit -import System.FilePath (takeFileName) -import qualified Data.ByteString.Base64 as Base64 -import Control.Monad ((<=<), foldM) import Control.Exception (throwIO, ErrorCall (ErrorCall)) -import Data.List (intersperse) -import qualified Data.Text.Lazy as LT -import qualified Data.Text.Lazy.Encoding as LT -import Data.ByteString.Char8 () +import Control.Monad ((<=<), foldM) import Data.Bits ((.&.), shiftR) +import Data.ByteString qualified as S +import Data.ByteString.Base64 qualified as Base64 +import Data.ByteString.Char8 () +import Data.ByteString.Lazy qualified as L import Data.Char (isAscii) -import Data.Word (Word8) -import qualified Data.ByteString as S +import Data.List (intersperse) import Data.Text (Text) -import qualified Data.Text as T -import qualified Data.Text.Encoding as TE +import Data.Text qualified as T +import Data.Text.Encoding qualified as TE +import Data.Text.Lazy qualified as LT +import Data.Text.Lazy.Encoding qualified as LT +import Data.Word (Word8) +import System.Exit +import System.FilePath (takeFileName) +import System.IO +import System.Process +import System.Random + -- | Generates a random sequence of alphanumerics of the given length. randomString :: RandomGen d => Int -> d -> (String, d) diff --git a/src/Notmuch.hs b/src/Notmuch.hs index 310657a..68c3c68 100644 --- a/src/Notmuch.hs +++ b/src/Notmuch.hs @@ -1,23 +1,23 @@ -{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} + module Notmuch where -import qualified Data.ByteString.Lazy as LBS -import qualified Data.ByteString.Lazy.Char8 as LBS8 -import qualified Data.Text.Lazy as LT -import qualified Data.Text.Lazy.Encoding as LT -import qualified Network.Mail.Mime as M import Data.Aeson.Extends +import Data.ByteString.Lazy qualified as LBS +import Data.ByteString.Lazy.Char8 qualified as LBS8 import Data.Either.Combinators (mapRight) import Data.Functor ((<&>)) +import Data.Text.Lazy qualified as LT +import Data.Text.Lazy.Encoding qualified as LT import Data.Tree +import Much.ParseMail (readMail) +import Much.TagUtils +import Network.Mail.Mime qualified as M import Notmuch.Class import Notmuch.Message import Notmuch.SearchResult -import Much.ParseMail (readMail) import System.Exit import System.Process.ByteString.Lazy (readProcessWithExitCode) -import Much.TagUtils notmuch :: [String] -> IO LBS.ByteString diff --git a/src/Notmuch/Message.hs b/src/Notmuch/Message.hs index 681b5db..07564ca 100644 --- a/src/Notmuch/Message.hs +++ b/src/Notmuch/Message.hs @@ -1,21 +1,19 @@ -{-# LANGUAGE GeneralizedNewtypeDeriving #-} -{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedStrings #-} + module Notmuch.Message where import Data.Aeson import Data.Aeson.Types (Parser) +import Data.ByteString.Lazy.Char8 qualified as LBS8 +import Data.CaseInsensitive qualified as CI +import Data.Map qualified as M +import Data.Text qualified as T import Data.Time.Calendar import Data.Time.Clock import Data.Time.Clock.POSIX +import Data.Tree qualified as TR +import Data.Vector qualified as V import Notmuch.Class -import qualified Data.ByteString.Lazy.Char8 as LBS8 -import qualified Data.Text as T -import qualified Data.Map as M -import qualified Data.CaseInsensitive as CI -import qualified Data.Vector as V - -import qualified Data.Tree as TR newtype MessageID = MessageID { unMessageID :: String } diff --git a/src/Notmuch/SearchResult.hs b/src/Notmuch/SearchResult.hs index 55b8a95..93eeb7b 100644 --- a/src/Notmuch/SearchResult.hs +++ b/src/Notmuch/SearchResult.hs @@ -1,5 +1,5 @@ -{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings #-} + module Notmuch.SearchResult where import Data.Aeson |
