summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/much.hs9
-rw-r--r--much.cabal4
-rw-r--r--src/Blessings/String/Extra.hs1
-rw-r--r--src/Data/Aeson/Extends.hs7
-rw-r--r--src/Much/API.hs6
-rw-r--r--src/Much/Action.hs13
-rw-r--r--src/Much/Config.hs8
-rw-r--r--src/Much/Core.hs16
-rw-r--r--src/Much/MBox.hs44
-rw-r--r--src/Much/MappedSets.hs12
-rw-r--r--src/Much/ParseMail.hs28
-rw-r--r--src/Much/RenderTreeView.hs19
-rw-r--r--src/Much/Screen.hs1
-rw-r--r--src/Much/State.hs18
-rw-r--r--src/Much/TagUtils.hs8
-rw-r--r--src/Much/TreeView.hs9
-rw-r--r--src/Much/TreeView/Types.hs6
-rw-r--r--src/Network/Mail/Mime.hs36
-rw-r--r--src/Notmuch.hs16
-rw-r--r--src/Notmuch/Message.hs16
-rw-r--r--src/Notmuch/SearchResult.hs2
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
diff --git a/much.cabal b/much.cabal
index 06ba74a..53b5da3 100644
--- a/much.cabal
+++ b/much.cabal
@@ -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