-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

-- |
-- Module      :  Disco.Util
-- Copyright   :  disco team and contributors
-- Maintainer  :  byorgey@gmail.com
--
-- SPDX-License-Identifier: BSD-3-Clause
--
-- Miscellaneous utilities.
module Disco.Util where

import qualified Data.Map as M

infixr 1 ==>

-- | A synonym for pairing which makes convenient syntax for
--   constructing literal maps via M.fromList.
(==>) :: a -> b -> (a, b)
==> :: forall a b. a -> b -> (a, b)
(==>) = (,)

for :: [a] -> (a -> b) -> [b]
for :: forall a b. [a] -> (a -> b) -> [b]
for = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a b. (a -> b) -> [a] -> [b]
map

(!) :: (Show k, Ord k) => M.Map k v -> k -> v
Map k v
m ! :: forall k v. (Show k, Ord k) => Map k v -> k -> v
! k
k = case forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup k
k Map k v
m of
  Maybe v
Nothing -> forall a. HasCallStack => [Char] -> a
error forall a b. (a -> b) -> a -> b
$ [Char]
"key " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show k
k forall a. [a] -> [a] -> [a]
++ [Char]
" is not an element in the map"
  Just v
v -> v
v