packages feed

ghc-lib-0.20221201: compiler/GHC/CmmToAsm/Wasm/Utils.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE Strict #-}

module GHC.CmmToAsm.Wasm.Utils
  ( naturalNarrowing,
    widthMax,
    detEltsUFM,
    detEltsUniqMap,
    builderCommas,
  )
where

import Data.ByteString.Builder
import Data.List (intersperse, sortOn)
import GHC.Cmm
import GHC.Prelude
import GHC.Types.Unique.FM
import GHC.Types.Unique.Map

naturalNarrowing :: Width -> Integer -> Integer
naturalNarrowing w i
  | i < 0 = narrowS w i
  | otherwise = narrowU w i

widthMax :: Width -> Integer
widthMax w = (1 `shiftL` widthInBits w) - 1

detEltsUFM :: Ord k => UniqFM k0 (k, a) -> [(k, a)]
detEltsUFM = sortOn fst . nonDetEltsUFM

detEltsUniqMap :: Ord k => UniqMap k a -> [(k, a)]
detEltsUniqMap = sortOn fst . nonDetEltsUniqMap

builderCommas :: (a -> Builder) -> [a] -> Builder
builderCommas f xs = mconcat (intersperse ", " (map f xs))