From d264b95ac080a725031a722ef5cd6b1030503d31 Mon Sep 17 00:00:00 2001 From: pingu Date: Wed, 4 Mar 2026 16:49:51 +0100 Subject: [PATCH] wip --- app/Main.hs | 40 ++++++++++++++++++++++++++++------------ flake.nix | 2 -- mide.cabal | 2 ++ 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/app/Main.hs b/app/Main.hs index 4d73b7e..53c1ada 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -14,11 +14,20 @@ import WithCli import Control.Monad.Reader import Data.Yaml import Data.Functor -import Data.Maybe import System.Environment.XDG.BaseDir import Data.HashMap.Lazy (HashMap, insert, alter, toList) import System.Environment.XDG.DesktopEntry import System.Process +import Data.Text (Text) +import qualified Data.Text as T +import qualified Data.Text.IO as T +import Brick +import qualified Brick.Widgets.Edit as BE +import qualified Brick.Widgets.List as BL +import Data.List + +(|>) :: (a -> b) -> (b -> c) -> a -> c +(|>) = flip (.) data Options = Options { config :: Maybe FilePath, @@ -41,20 +50,20 @@ class Config a where cachePath :: a -> IO FilePath instance Config TConfig where - cachePath = (\case + cachePath = (.cachePath) |> \case Nothing -> defaultCachePath - Just f -> pure f) . (.cachePath) + Just f -> pure f -type Cache = HashMap String Int +type Cache = HashMap Text Int -data CacheItem = CacheItem { name :: String +data CacheItem = CacheItem { name :: Text , uses :: Int } deriving (Show, Generic, FromJSON, ToJSON) data Item where AppItem :: DesktopEntry -> Item - DMenuItem :: String -> Item + DMenuItem :: Text -> Item deriving Show type State = (TConfig, Cache) @@ -71,15 +80,16 @@ main = withCliModified [ AddShortOption "config" 'c', run :: Options -> IO () run opts = maybe defaultConfigPath pure opts.config >>= \configPath -> - decodeFileEither configPath >>= either (const $ Config . pure <$> defaultCachePath) pure >>= \config -> - (cachePath config >>= decodeFileEither <&> either mempty ((foldr (\p -> insert p.name p.uses) mempty) :: [CacheItem] -> HashMap String Int)) >>= \cache -> - runReaderT ( updateCache =<< execItem =<< presentOptions =<< if opts.dmenu then dmenu else normal) (config,cache) + decodeFileEither configPath >>= either (const $ Config . pure <$> defaultCachePath) pure >>= + (\Config{..} -> pure Config{cachePath = maybe cachePath pure opts.cache, ..}) >>= \config -> + (cachePath config >>= decodeFileEither <&> either mempty (foldr (\p -> insert p.name p.uses) mempty :: [CacheItem] -> HashMap Text Int)) >>= \cache -> + flip runReaderT (config,cache) (updateCache =<< execItem =<< presentOptions =<< if opts.dmenu then dmenu else normal) normal :: (MonadIO m, MonadReader State m) => m [Item] normal = liftIO getDirectoryEntriesDefault <&> (AppItem <$>) dmenu :: (MonadIO m, MonadReader State m) => m [Item] -dmenu = liftIO getContents <&> (DMenuItem <$>) . lines +dmenu = liftIO T.getContents <&> (DMenuItem <$>) . T.lines presentOptions :: (MonadIO m, MonadReader State m) => [Item] -> m Item presentOptions ls = mapM_ (liftIO . print) ls >> pure (head ls) @@ -87,13 +97,19 @@ presentOptions ls = mapM_ (liftIO . print) ls >> pure (head ls) execItem :: (MonadIO m, MonadReader State m) => Item -> m Item execItem i = (case i of AppItem de -> liftIO (maybe undefined (void . spawnCommand) (deCommand de)) - DMenuItem s -> liftIO (putStrLn s)) >> pure i + DMenuItem s -> liftIO (T.putStrLn s)) >> pure i updateCache :: (MonadIO m, MonadReader State m) => Item -> m () updateCache i = let name = case i of - AppItem d -> deName [] d + AppItem d -> T.pack $ deName [] d DMenuItem s -> s in ask >>= \(conf, hmap) -> liftIO (cachePath conf >>= \path -> encodeFile path . map (uncurry CacheItem) . toList $ alter (\case Nothing -> pure 1; Just x -> pure (x+1)) name hmap) + +data Controls = TextSearch | ListResults + +data AppS = AppS { appEditText :: BE.Editor Text Controls + , appItems :: [Item] + } diff --git a/flake.nix b/flake.nix index a2fc991..0a3b7c4 100644 --- a/flake.nix +++ b/flake.nix @@ -78,8 +78,6 @@ # # don't check version bounds # constraints = hlib.doJailbreak hprev.constraints; - # ghc-prim = hlib.doJailbreak hprev.ghc-prim; - # text = hlib.doJailbreak hprev.text; }); }; }; diff --git a/mide.cabal b/mide.cabal index 1bd27be..4a9e560 100644 --- a/mide.cabal +++ b/mide.cabal @@ -77,6 +77,8 @@ executable mide , bytestring , process , aeson + , text + , brick -- Directories containing source files. hs-source-dirs: app