Как я могу изменить набор окон в XMonad?

У меня есть функция, которая выглядит так:

sinkFocus :: StackSet i l a s sd -> Maybe (StackSet i l a s sd)
sinkFocus = (fmap . flip sink) <*> peek

Однако я хотел бы X (), чтобы я мог его использовать. Например, additionalKeys использует X ().

В документации сказано, что X является IO с некоторыми преобразователями состояния и считывателя, поэтому у меня сложилось впечатление, что StackSet содержится в состоянии X. Таким образом, теоретически должна быть возможность изменить соответствующую часть состояния. Однако доступное состояние — это XState, а не StackState, которое я хочу, поэтому мне нужно иметь возможность превратить мою функцию на StackState в функцию на XState.

Это было бы достаточно просто, если бы у меня была функция типа

(StackSet i l a s sd -> StackSet i l a s sd) -> X ()

Однако, покопавшись в документации, я еще не смог собрать воедино способ сделать это. Есть ли способ взять функцию на StackSet и сделать X (), который выполняет эту функцию?


person Éamonn Olive    schedule 13.12.2019    source источник


Ответы (1)


Монада X имеет экземпляр MonadState

instance MonadState XState X

Таким образом, мы можем использовать modify как

modify :: (XState -> XState) -> X ()

Так что нам нужно превратить функцию в одну на XStateс. И если мы посмотрим на определение

XState
    windowset :: !WindowSet
    mapped :: !(Set Window)
    waitingUnmap :: !(Map Window Int)
    dragging :: !(Maybe (Position -> Position -> X (), X ())) 
    numberlockMask :: !KeyMask
    extensibleState :: !(Map String (Either String StateExtension))

мы увидим WindowSet, который является псевдонимом типа для конкретного StackState. Таким образом, вы можете превратить функцию из StackStates в функцию XStates следующим образом:

overWindowSet :: (WindowSet -> WindowSet) -> XState -> XState
overWindowSet f xState = xState { windowset = f (windowset xState) }

Это можно комбинировать с modify, чтобы сделать полную функцию, которую вы хотели бы:

modify . overWindowSet
person Éamonn Olive    schedule 13.12.2019
comment
Я не против отрицательных голосов, но если у вас есть проблемы с ответом, я был бы рад его улучшить. - person Éamonn Olive; 13.12.2019