{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Vgrep.KeybindingMap where

import           Data.Map.Strict (Map)
import qualified Data.Map.Strict as M
import           Vgrep.Command
import qualified Vgrep.Key       as Key


newtype KeybindingMap = KeybindingMap { KeybindingMap -> Map Chord Command
unKeybindingMap :: Map Key.Chord Command }
  deriving (Int -> KeybindingMap -> ShowS
[KeybindingMap] -> ShowS
KeybindingMap -> String
(Int -> KeybindingMap -> ShowS)
-> (KeybindingMap -> String)
-> ([KeybindingMap] -> ShowS)
-> Show KeybindingMap
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KeybindingMap] -> ShowS
$cshowList :: [KeybindingMap] -> ShowS
show :: KeybindingMap -> String
$cshow :: KeybindingMap -> String
showsPrec :: Int -> KeybindingMap -> ShowS
$cshowsPrec :: Int -> KeybindingMap -> ShowS
Show, KeybindingMap -> KeybindingMap -> Bool
(KeybindingMap -> KeybindingMap -> Bool)
-> (KeybindingMap -> KeybindingMap -> Bool) -> Eq KeybindingMap
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KeybindingMap -> KeybindingMap -> Bool
$c/= :: KeybindingMap -> KeybindingMap -> Bool
== :: KeybindingMap -> KeybindingMap -> Bool
$c== :: KeybindingMap -> KeybindingMap -> Bool
Eq, b -> KeybindingMap -> KeybindingMap
NonEmpty KeybindingMap -> KeybindingMap
KeybindingMap -> KeybindingMap -> KeybindingMap
(KeybindingMap -> KeybindingMap -> KeybindingMap)
-> (NonEmpty KeybindingMap -> KeybindingMap)
-> (forall b. Integral b => b -> KeybindingMap -> KeybindingMap)
-> Semigroup KeybindingMap
forall b. Integral b => b -> KeybindingMap -> KeybindingMap
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
stimes :: b -> KeybindingMap -> KeybindingMap
$cstimes :: forall b. Integral b => b -> KeybindingMap -> KeybindingMap
sconcat :: NonEmpty KeybindingMap -> KeybindingMap
$csconcat :: NonEmpty KeybindingMap -> KeybindingMap
<> :: KeybindingMap -> KeybindingMap -> KeybindingMap
$c<> :: KeybindingMap -> KeybindingMap -> KeybindingMap
Semigroup, Semigroup KeybindingMap
KeybindingMap
Semigroup KeybindingMap
-> KeybindingMap
-> (KeybindingMap -> KeybindingMap -> KeybindingMap)
-> ([KeybindingMap] -> KeybindingMap)
-> Monoid KeybindingMap
[KeybindingMap] -> KeybindingMap
KeybindingMap -> KeybindingMap -> KeybindingMap
forall a.
Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
mconcat :: [KeybindingMap] -> KeybindingMap
$cmconcat :: [KeybindingMap] -> KeybindingMap
mappend :: KeybindingMap -> KeybindingMap -> KeybindingMap
$cmappend :: KeybindingMap -> KeybindingMap -> KeybindingMap
mempty :: KeybindingMap
$cmempty :: KeybindingMap
$cp1Monoid :: Semigroup KeybindingMap
Monoid)

lookup :: Key.Chord -> KeybindingMap -> Maybe Command
lookup :: Chord -> KeybindingMap -> Maybe Command
lookup Chord
chord (KeybindingMap Map Chord Command
m) = Chord -> Map Chord Command -> Maybe Command
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Chord
chord Map Chord Command
m

fromList :: [(Key.Chord, Command)] -> KeybindingMap
fromList :: [(Chord, Command)] -> KeybindingMap
fromList = Map Chord Command -> KeybindingMap
KeybindingMap (Map Chord Command -> KeybindingMap)
-> ([(Chord, Command)] -> Map Chord Command)
-> [(Chord, Command)]
-> KeybindingMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Chord, Command)] -> Map Chord Command
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList