# Pastebin atKmxOH8 import qualified Data.HashMap.Monoidal as MH import qualified Data.HashMap.Strict as HashMap import Data.Semigroup (First (..)) import Prelude hiding (First) transpose :: forall k1 k2 v. (Eq k1, Hashable k1, Eq k2, Hashable k2) => HashMap k1 (HashMap k2 v) -> HashMap k2 (HashMap k1 v) transpose h = let lists :: [(k1, [(k2, v)])] lists = HashMap.toList $ HashMap.toList <$> h in coerce . mconcat $ [ MH.singleton k2 . MH.singleton k1 $ First v | (k1, m) <- lists, (k2, v) <- m ]