diff --git a/flake.lock b/flake.lock index 0e47eb3..37d2d9a 100644 --- a/flake.lock +++ b/flake.lock @@ -238,6 +238,27 @@ "type": "github" } }, + "flake-parts_4": { + "inputs": { + "nixpkgs-lib": [ + "xmonad-config", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1738453229, + "narHash": "sha256-7H9XgNiGLKN1G1CgRh0vUL4AheZSYzPm+zmZ7vxbJdo=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "32ea77a06711b758da0ad9bd6a844c5740a87abd", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, "flake-utils": { "inputs": { "systems": "systems_2" @@ -309,6 +330,21 @@ "type": "github" } }, + "fourmolu-nix": { + "locked": { + "lastModified": 1707266073, + "narHash": "sha256-tCFzZQJicDdYjnuJiNK4hiiRAH7c2wQzMhOCdUMbVKE=", + "owner": "jedimahdi", + "repo": "fourmolu-nix", + "rev": "717f5a91b0d7b97b1be7ecc3a0fd42d37ffe1c9b", + "type": "github" + }, + "original": { + "owner": "jedimahdi", + "repo": "fourmolu-nix", + "type": "github" + } + }, "freetype2": { "flake": false, "locked": { @@ -359,6 +395,22 @@ "type": "github" } }, + "git-hooks_2": { + "flake": false, + "locked": { + "lastModified": 1737465171, + "narHash": "sha256-R10v2hoJRLq8jcL4syVFag7nIGE7m13qO48wRIukWNg=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "9364dc02281ce2d37a1f55b6e51f7c0f65a75f17", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, "gitignore": { "inputs": { "nixpkgs": [ @@ -421,6 +473,21 @@ "type": "github" } }, + "haskell-flake": { + "locked": { + "lastModified": 1739713768, + "narHash": "sha256-P8I3uARBkSra86d5lgTo7cK+ET27zVee1BxWrym+9z8=", + "owner": "srid", + "repo": "haskell-flake", + "rev": "b40fcefa008ffa7205058f542a577cc218bec9a4", + "type": "github" + }, + "original": { + "owner": "srid", + "repo": "haskell-flake", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -589,6 +656,21 @@ "type": "github" } }, + "nixos-unified": { + "locked": { + "lastModified": 1739631166, + "narHash": "sha256-BvGPP1MwuRZMK+4RLvMOQYUs15n5JA7BDH6TsXlsAU0=", + "owner": "srid", + "repo": "nixos-unified", + "rev": "f9598ba02ad38df238a5987ad78ffac4845b7f3a", + "type": "github" + }, + "original": { + "owner": "srid", + "repo": "nixos-unified", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1703013332, @@ -697,6 +779,22 @@ "type": "github" } }, + "nixpkgs_6": { + "locked": { + "lastModified": 1739863612, + "narHash": "sha256-UbtgxplOhFcyjBcNbTVO8+HUHAl/WXFDOb6LvqShiZo=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "632f04521e847173c54fa72973ec6c39a371211c", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixvim": { "inputs": { "flake-parts": "flake-parts_2", @@ -704,11 +802,11 @@ "nixvim": "nixvim_2" }, "locked": { - "lastModified": 1739840000, - "narHash": "sha256-vpsGgix4Qk31V7zMlPT4mMR1Nw5+gwLeCd2P14nVzSc=", + "lastModified": 1740051406, + "narHash": "sha256-GLx59UkWzZI+ANWHu/pzShl4Rr21e372G1ik6ZYAq+M=", "ref": "refs/heads/master", - "rev": "bbfc2f6f47de17ea77973507ced1b56e84b671e2", - "revCount": 30, + "rev": "547ed496e74a01d74247e7e6591cc4f81eb78eab", + "revCount": 35, "type": "git", "url": "https://git.sajenim.dev/jasmine/nvim.nix.git" }, @@ -801,7 +899,8 @@ "nixpkgs": "nixpkgs_3", "nixpkgs-unstable": "nixpkgs-unstable", "nixvim": "nixvim", - "wezterm": "wezterm" + "wezterm": "wezterm", + "xmonad-config": "xmonad-config" } }, "rust-overlay": { @@ -972,6 +1071,29 @@ "type": "github" } }, + "xmonad-config": { + "inputs": { + "flake-parts": "flake-parts_4", + "fourmolu-nix": "fourmolu-nix", + "git-hooks": "git-hooks_2", + "haskell-flake": "haskell-flake", + "nixos-unified": "nixos-unified", + "nixpkgs": "nixpkgs_6" + }, + "locked": { + "lastModified": 1740305864, + "narHash": "sha256-3KGtxEbCElQBH8MyrloGcOb20orWlD5umdkQv+o0JtM=", + "ref": "refs/heads/master", + "rev": "020e0f57e7e0976204bb45842d497fc634a6185a", + "revCount": 8, + "type": "git", + "url": "https://git.sajenim.dev/jasmine/xmonad-config.git" + }, + "original": { + "type": "git", + "url": "https://git.sajenim.dev/jasmine/xmonad-config.git" + } + }, "zlib": { "flake": false, "locked": { diff --git a/flake.nix b/flake.nix index 524447e..488638b 100644 --- a/flake.nix +++ b/flake.nix @@ -35,6 +35,7 @@ # Add any other flake you might need. nix-minecraft.url = "github:Infinidoge/nix-minecraft"; nixvim.url = "git+https://git.sajenim.dev/jasmine/nvim.nix.git"; + xmonad-config.url = "git+https://git.sajenim.dev/jasmine/xmonad-config.git"; }; outputs = { diff --git a/home-manager/sajenim/features/desktop/default.nix b/home-manager/sajenim/features/desktop/default.nix index 96d214f..b1d29a1 100644 --- a/home-manager/sajenim/features/desktop/default.nix +++ b/home-manager/sajenim/features/desktop/default.nix @@ -16,8 +16,7 @@ home.packages = with pkgs; [ feh - xmobar # custom build using xmobar-config - xmonad # custom build using xmonad-config + inputs.xmonad-config.packages.${pkgs.system}.default ]; home.file = { diff --git a/home-manager/sajenim/features/desktop/wezterm/config/wezterm.lua b/home-manager/sajenim/features/desktop/wezterm/config/wezterm.lua index f84a0b6..4c159d9 100644 --- a/home-manager/sajenim/features/desktop/wezterm/config/wezterm.lua +++ b/home-manager/sajenim/features/desktop/wezterm/config/wezterm.lua @@ -61,7 +61,7 @@ config.inactive_pane_hsb = { --| Tab Bar Appearance config.use_fancy_tab_bar = false config.enable_tab_bar = true -config.hide_tab_bar_if_only_one_tab = true +config.hide_tab_bar_if_only_one_tab = false config.tab_bar_at_bottom = false config.tab_max_width = 24 config.show_tab_index_in_tab_bar = false diff --git a/home-manager/sajenim/fuchsia.nix b/home-manager/sajenim/fuchsia.nix index 3c279e1..e476c48 100644 --- a/home-manager/sajenim/fuchsia.nix +++ b/home-manager/sajenim/fuchsia.nix @@ -23,7 +23,10 @@ # Misc libreoffice firefox + google-chrome ledger-live-desktop + unstable.zoom-us + zathura ]; }; } diff --git a/nixos/common/optional/persist.nix b/nixos/common/optional/persist.nix index 28a27c9..f0f4a54 100644 --- a/nixos/common/optional/persist.nix +++ b/nixos/common/optional/persist.nix @@ -10,6 +10,7 @@ "/var/log" "/var/lib/bluetooth" "/var/lib/docker" + "/var/lib/flatpak" "/var/lib/nixos" "/var/lib/systemd/coredump" "/etc/NetworkManager/system-connections" diff --git a/nixos/fuchsia/configuration.nix b/nixos/fuchsia/configuration.nix index 8e58b88..055bdae 100644 --- a/nixos/fuchsia/configuration.nix +++ b/nixos/fuchsia/configuration.nix @@ -12,6 +12,7 @@ # Services ./services/amdgpu-clocks + ./services/flatpak ./services/libinput ./services/ollama ./services/printers diff --git a/nixos/fuchsia/services/flatpak/default.nix b/nixos/fuchsia/services/flatpak/default.nix new file mode 100644 index 0000000..01d397d --- /dev/null +++ b/nixos/fuchsia/services/flatpak/default.nix @@ -0,0 +1,10 @@ +{pkgs, ...}: { + # Required to install flatpak + xdg.portal = { + enable = true; + config.common.default = ["gtk"]; + extraPortals = [pkgs.xdg-desktop-portal-wlr]; + }; + + services.flatpak.enable = true; +} diff --git a/pkgs/default.nix b/pkgs/default.nix index 0a16cb0..fe1661a 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -1,7 +1,5 @@ # Custom packages, that can be defined similarly to ones from nixpkgs # You can build them using 'nix build .#example' pkgs: { - xmobar = pkgs.callPackage ./xmobar-config {}; - xmonad = pkgs.callPackage ./xmonad-config {}; amdgpu-clocks = pkgs.callPackage ./amdgpu-clocks {}; } diff --git a/pkgs/xmobar-config/.envrc b/pkgs/xmobar-config/.envrc deleted file mode 100644 index 4a4726a..0000000 --- a/pkgs/xmobar-config/.envrc +++ /dev/null @@ -1 +0,0 @@ -use_nix diff --git a/pkgs/xmobar-config/default.nix b/pkgs/xmobar-config/default.nix deleted file mode 100644 index a414727..0000000 --- a/pkgs/xmobar-config/default.nix +++ /dev/null @@ -1,4 +0,0 @@ -{pkgs}: -pkgs.haskellPackages.developPackage { - root = ./.; -} diff --git a/pkgs/xmobar-config/shell.nix b/pkgs/xmobar-config/shell.nix deleted file mode 100644 index fc5f52c..0000000 --- a/pkgs/xmobar-config/shell.nix +++ /dev/null @@ -1,4 +0,0 @@ -{pkgs ? import {}}: -pkgs.mkShell { - nativeBuildInputs = with pkgs.buildPackages; [cabal-install ghc]; -} diff --git a/pkgs/xmobar-config/src/xmobar-top.hs b/pkgs/xmobar-config/src/xmobar-top.hs deleted file mode 100644 index bff0084..0000000 --- a/pkgs/xmobar-config/src/xmobar-top.hs +++ /dev/null @@ -1,28 +0,0 @@ -import Xmobar - --- | Configuration -config :: Config -config = defaultConfig - -- general settings - { font = "Fira Code Semi Bold 9" - , additionalFonts = [ "Symbols Nerd Font 2048-em 24" ] - , bgColor = "#282828" - , fgColor = "#d4be98" - , position = Static { xpos = 1920, ypos = 0, width = 2560, height = 24 } - -- commands to run - , commands = - [ Run $ XPropertyLog "_XMONAD_LOG_1" - , Run $ Com "uname" ["-r","-s"] "" 0 - , Run $ Date "%a %b %_d %Y %H:%M:%S" "date" 10 - , Run $ Weather "YPJT" - [ "-t", "Temp: C | Wind: km/h | Humidity: %" ] - 18000 - ] - -- format our bar - , sepChar = "%" - , alignSep = "}{" - , template = "\59255 %uname% |%_XMONAD_LOG_1%}{%YPJT% | %date%" - } - -main :: IO () -main = configFromArgs config >>= xmobar diff --git a/pkgs/xmobar-config/xmobar-config.cabal b/pkgs/xmobar-config/xmobar-config.cabal deleted file mode 100644 index b1ec891..0000000 --- a/pkgs/xmobar-config/xmobar-config.cabal +++ /dev/null @@ -1,18 +0,0 @@ -cabal-version: 3.0 -name: xmobar-config -version: 0.1.0.0 -synopsis: A Minimalistic Text Based Status Bar -description: my xmobar configuration -license: BSD-3-Clause -author: sajenim -maintainer: its.jassy@pm.me -build-type: Simple - -executable xmobar-top - main-is: xmobar-top.hs - hs-source-dirs: src - ghc-options: -Wall -threaded - build-depends: base, - xmobar - default-language: Haskell2010 - diff --git a/pkgs/xmonad-config/.envrc b/pkgs/xmonad-config/.envrc deleted file mode 100644 index 4a4726a..0000000 --- a/pkgs/xmonad-config/.envrc +++ /dev/null @@ -1 +0,0 @@ -use_nix diff --git a/pkgs/xmonad-config/default.nix b/pkgs/xmonad-config/default.nix deleted file mode 100644 index 251e2f3..0000000 --- a/pkgs/xmonad-config/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -{pkgs}: -pkgs.haskellPackages.developPackage { - root = ./.; - source-overrides = { - xmonad = builtins.fetchTarball { - url = "https://github.com/xmonad/xmonad/archive/refs/tags/v0.18.0.tar.gz"; - sha256 = "0jlc60n5jarcxgjxm1vcsgc3s2lwmn3c3n56hialhzx54wfskkbc"; - }; - }; -} diff --git a/pkgs/xmonad-config/shell.nix b/pkgs/xmonad-config/shell.nix deleted file mode 100644 index fc5f52c..0000000 --- a/pkgs/xmonad-config/shell.nix +++ /dev/null @@ -1,4 +0,0 @@ -{pkgs ? import {}}: -pkgs.mkShell { - nativeBuildInputs = with pkgs.buildPackages; [cabal-install ghc]; -} diff --git a/pkgs/xmonad-config/src/xmonad.hs b/pkgs/xmonad-config/src/xmonad.hs deleted file mode 100644 index 54770d0..0000000 --- a/pkgs/xmonad-config/src/xmonad.hs +++ /dev/null @@ -1,178 +0,0 @@ --- Base -import XMonad -import System.Exit -import qualified XMonad.StackSet as W - --- Actions -import XMonad.Actions.CycleWS - --- Hooks -import XMonad.Hooks.EwmhDesktops -import XMonad.Hooks.ManageDocks - --- Layout modifiers -import XMonad.Layout.Spacing -import XMonad.Layout.Renamed -import XMonad.Layout.NoBorders -import XMonad.Layout.BinarySpacePartition - --- Utilities -import XMonad.Util.EZConfig (additionalKeys) - --- This file is generated based on X.org includes. It contains the keysyms for XF86. -import Graphics.X11.ExtraTypes.XF86 - --- xmobar dependencies -import XMonad.Hooks.DynamicLog -import XMonad.Hooks.StatusBar -import XMonad.Hooks.StatusBar.PP -import XMonad.Util.Loggers - --- | Configuration -myTerminal = "wezterm" -myModMask = mod4Mask -myBorderWidth = 5 -myNormalBorderColor = "#282828" -myFocusedBorderColor = "#282828" -myWorkspaces = ["code", "chat", "web", "games", "misc"] -myLauncher = "rofi -modi run,calc -show run" -myScrot = "scrot -s '%Y%m%d_%H%M%S.png' -e 'mv $f ~/Pictures/scrots/'" -volDown = "pactl set-sink-volume @DEFAULT_SINK@ -10%" -volUp = "pactl set-sink-volume @DEFAULT_SINK@ +10%" - --- | Keybindings -myKeys = - -- launching and killing programs - [ ((myModMask, xK_Return), spawn myTerminal ) -- %! Launch terminal - , ((myModMask, xK_Tab ), spawn myLauncher ) -- %! Launch rofi - , ((myModMask, xK_s ), spawn myScrot ) -- %! Take screenshot - , ((myModMask, xK_Escape), kill ) -- %! Close the focused window - , ((myModMask .|. controlMask, xK_Escape), io exitSuccess ) -- %! Quit xmonad - - -- multimedia - , ((noModMask, xF86XK_AudioPlay ), spawn "mpc toggle") -- %! Play/Pause music - , ((noModMask, xF86XK_AudioStop ), spawn "mpc stop" ) -- %! Stop music - , ((noModMask, xF86XK_AudioNext ), spawn "mpc next" ) -- %! Next track - , ((noModMask, xF86XK_AudioPrev ), spawn "mpc prev" ) -- %! Previous track - , ((noModMask, xF86XK_AudioLowerVolume ), spawn volDown ) -- %! Volume down - , ((noModMask, xF86XK_AudioRaiseVolume ), spawn volUp ) -- %! Volume up - - -- layouts - , ((myModMask, xK_t ), sendMessage $ JumpToLayout "tile") -- %! Jump to our tiled layout - , ((myModMask, xK_b ), sendMessage $ JumpToLayout "bsp" ) -- %! Jump to our bsp layout - , ((myModMask, xK_m ), sendMessage $ JumpToLayout "max" ) -- %! Jump to our maximized layout - , ((myModMask, xK_f ), sendMessage $ JumpToLayout "full") -- %! Jump to our fullscreen layout - , ((myModMask .|. shiftMask, xK_t ), withFocused $ windows . W.sink ) -- %! Push window back into tiling - - -- window stack - , ((myModMask, xK_Down ), windows W.focusDown ) -- %! Move focus to the next window - , ((myModMask, xK_Up ), windows W.focusUp ) -- %! Move focus to the previous window - , ((myModMask .|. shiftMask, xK_Down ), windows W.swapDown ) -- %! Swap the focused window with the next window - , ((myModMask .|. shiftMask, xK_Up ), windows W.swapUp ) -- %! Swap the focused window with the previous window - - -- master slave - , ((myModMask, xK_space ), windows W.focusMaster ) -- %! Move focus to the master window - , ((myModMask .|. shiftMask, xK_space ), windows W.swapMaster ) -- %! Swap the focused window with the master window - , ((myModMask, xK_Page_Up ), sendMessage Shrink ) -- %! Shrink the master area - , ((myModMask, xK_Page_Down), sendMessage Expand ) -- %! Expand the master area - , ((myModMask .|. shiftMask, xK_Page_Up ), sendMessage (IncMasterN 1) ) -- %! Increase the number of windows in the master area - , ((myModMask .|. shiftMask, xK_Page_Down), sendMessage (IncMasterN (-1)) ) -- %! Decrease the number of windows in the master area - - -- workspaces - , ((myModMask, xK_Right ), moveTo Next hiddenWS ) -- %! Move focus to the next hidden workspace - , ((myModMask, xK_Left ), moveTo Prev hiddenWS ) -- %! Move focus to the previous hidden workspace - , ((myModMask .|. shiftMask, xK_Right ), shiftTo Next hiddenWS ) -- %! Move focused window to the next hidden workspace - , ((myModMask .|. shiftMask, xK_Left ), shiftTo Prev hiddenWS ) -- %! Move focused window to the previous hidden workspace - - -- monitors - , ((myModMask, xK_End ), nextScreen ) -- %! Move focus to the next screen - , ((myModMask, xK_Home ), prevScreen ) -- %! Move focus to the previous screen - , ((myModMask .|. shiftMask, xK_End ), shiftNextScreen ) -- %! Move focused window to the next screen - , ((myModMask .|. shiftMask, xK_Home ), shiftPrevScreen ) -- %! Move focused window to the previous screen - - -- binary space partition - , ((myModMask .|. mod1Mask, xK_Right ), sendMessage $ ExpandTowardsBy R 0.01) -- %! Expand window towards the right - , ((myModMask .|. mod1Mask, xK_Left ), sendMessage $ ExpandTowardsBy L 0.01) -- %! Expand window towards the left - , ((myModMask .|. mod1Mask, xK_Down ), sendMessage $ ExpandTowardsBy D 0.01) -- %! Expand window downwards - , ((myModMask .|. mod1Mask, xK_Up ), sendMessage $ ExpandTowardsBy U 0.01) -- %! Expand window upwards - , ((myModMask .|. mod1Mask .|. controlMask, xK_Right ), sendMessage $ ShrinkFromBy R 0.01) -- %! Shrink window from the right - , ((myModMask .|. mod1Mask .|. controlMask, xK_Left ), sendMessage $ ShrinkFromBy L 0.01) -- %! Shrink window from the left - , ((myModMask .|. mod1Mask .|. controlMask, xK_Down ), sendMessage $ ShrinkFromBy D 0.01) -- %! Shrink window downwards - , ((myModMask .|. mod1Mask .|. controlMask, xK_Up ), sendMessage $ ShrinkFromBy U 0.01) -- %! Shrink window upwards - , ((myModMask .|. mod1Mask, xK_Page_Up ), sendMessage Rotate ) -- %! Rotate a split (horizontal/vertical) in the BSP - , ((myModMask .|. mod1Mask, xK_Page_Down), sendMessage Swap ) -- %! Swap the left child of a split with the right child of split - , ((myModMask .|. mod1Mask, xK_Home ), sendMessage $ SplitShift Prev ) -- %! Shift window by splitting previous neighbour - , ((myModMask .|. mod1Mask, xK_End ), sendMessage $ SplitShift Next ) -- %! Shift window by splitting next neighbour - ] - --- | Layouts -myLayout = tile ||| bsp ||| max ||| full - where - -- Add a configurable amount of space around windows. - gaps = spacingRaw False (Border 10 10 10 10) True (Border 10 10 10 10) True - -- Our layouts - tile = renamed [Replace "tile"] . avoidStruts . gaps $ Tall nmaster delta ratio - bsp = renamed [Replace "bsp" ] . avoidStruts . gaps $ emptyBSP - max = renamed [Replace "max" ] . avoidStruts . gaps $ Full - full = renamed [Replace "full"] . noBorders $ Full - -- Layout settings - nmaster = 1 -- Default number of windows in the master pane - ratio = 1/2 -- Default proportion of screen occupied by master pane - delta = 3/100 -- Percent of screen to increment by when resizing panes - --- | Xmobar -xmobarTop = statusBarPropTo "_XMONAD_LOG_1" "xmobar-top" (pure ppTop) - -ppTop :: PP -ppTop = def - { ppSep = grey0 " | " - -- workspace labels - , ppCurrent = purple . wrap " " "" - , ppVisible = blue . wrap " " "" - , ppHidden = grey0 . wrap " " "" - , ppHiddenNoWindows = grey0 . wrap " " "" - , ppUrgent = red . wrap " " "" - -- misc - , ppLayout = aqua . wrap "" "" - , ppOrder = \[ws, l, _] -> [ws, l] - } - where - -- | Gruvbox material - bg0, bg1, fg0, fg1, red, orange, yellow, green, aqua, blue, purple :: String -> String - -- backgrounds - bg0 = xmobarColor "#1d2021" "" - bg1 = xmobarColor "#282828" "" - -- foregrounds - fg0 = xmobarColor "#d4be98" "" - fg1 = xmobarColor "#ddc7a1" "" - -- greys - grey0 = xmobarColor "#7c6f64" "" - -- colors - red = xmobarColor "#ea6962" "" - orange = xmobarColor "#e78a4e" "" - yellow = xmobarColor "#d8a658" "" - green = xmobarColor "#a9b665" "" - aqua = xmobarColor "#89b482" "" - blue = xmobarColor "#7daea3" "" - purple = xmobarColor "#d3869b" "" - --- | The main function -main :: IO () -main = xmonad - . docks - . ewmhFullscreen - . ewmh - . withSB (xmobarTop) - $ myConfig - -myConfig = def - { modMask = myModMask - , layoutHook = myLayout - , terminal = myTerminal - , borderWidth = myBorderWidth - , normalBorderColor = myNormalBorderColor - , focusedBorderColor = myFocusedBorderColor - , workspaces = myWorkspaces - } `additionalKeys` myKeys - - diff --git a/pkgs/xmonad-config/xmonad-config.cabal b/pkgs/xmonad-config/xmonad-config.cabal deleted file mode 100644 index 66b2197..0000000 --- a/pkgs/xmonad-config/xmonad-config.cabal +++ /dev/null @@ -1,20 +0,0 @@ -cabal-version: 3.0 -name: xmonad-config -version: 0.1.0.0 -synopsis: A tiling window manager -description: my xmonad configuration -license: BSD-3-Clause -author: sajenim -maintainer: its.jassy@pm.me -build-type: Simple - -executable xmonad - main-is: xmonad.hs - hs-source-dirs: src - ghc-options: -Wall - build-depends: base, - X11, - xmonad, - xmonad-contrib - default-language: Haskell2010 -