packages feed

diohsc-0.1.14.1: ClientState.hs

-- This file is part of Diohsc
-- Copyright (C) 2020-23 Martin Bays <mbays@sdf.org>
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of version 3 of the GNU General Public License as
-- published by the Free Software Foundation, or any later version.
--
-- You should have received a copy of the GNU General Public License
-- along with this program.  If not, see http://www.gnu.org/licenses/.

module ClientState where

import           Control.Monad.State (StateT, modify)
import           Text.Regex          (Regex)

import qualified Data.Map            as M
import qualified Data.Set            as S
import qualified Data.Text.Lazy      as T

import           ActiveIdentities
import           Alias
import qualified BStack
import           CommandLine
import           History
import           Marks
import           Queue
import           Request
import           TextGemini          (PreOpt (..))

data ClientConfig = ClientConfig
    { clientConfDefaultAction     :: (String, [CommandArg])
    , clientConfProxies           :: M.Map String Host
    , clientConfGeminators        :: [(String,(Regex,String))]
    , clientConfRenderFilter      :: Maybe String
    , clientConfPreOpt            :: PreOpt
    , clientConfLinkDescFirst     :: Bool
    , clientConfMaxLogLen         :: Int
    , clientConfMaxWrapWidth      :: Int
    , clientConfNoConfirm         :: Bool
    , clientConfVerboseConnection :: Bool
    }

defaultClientConfig :: ClientConfig
defaultClientConfig = ClientConfig ("page", []) M.empty [] Nothing PreOptPre False 1000 80 False False

data ClientState = ClientState
    { clientCurrent          :: Maybe HistoryItem
    , clientJumpBack         :: Maybe HistoryItem
    , clientLog              :: BStack.BStack T.Text
    , clientVisited          :: S.Set Int
    , clientQueues           :: QueueMap
    , clientActiveIdentities :: ActiveIdentities
    , clientMarks            :: Marks
    , clientSessionMarks     :: M.Map Int HistoryItem
    , clientAliases          :: Aliases
    , clientConfig           :: ClientConfig
    }

type ClientM = StateT ClientState IO

type CommandAction = HistoryItem -> ClientM ()

emptyClientState :: ClientState
emptyClientState = ClientState Nothing Nothing BStack.empty S.empty M.empty M.empty emptyMarks M.empty defaultAliases defaultClientConfig

modifyCConf :: (ClientConfig -> ClientConfig) -> ClientM ()
modifyCConf f = modify $ \s -> s { clientConfig = f $ clientConfig s }

modifyQueues :: (QueueMap -> QueueMap) -> ClientM ()
modifyQueues f = modify $ \s -> s { clientQueues = f $ clientQueues s }