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

module GHC.CmmToAsm.Wasm.Utils
  ( 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

widthMax :: Width -> Integer
widthMax :: Width -> Integer
widthMax Width
w = (Integer
1 forall a. Bits a => a -> Int -> a
`shiftL` Width -> Int
widthInBits Width
w) forall a. Num a => a -> a -> a
- Integer
1

detEltsUFM :: Ord k => UniqFM k0 (k, a) -> [(k, a)]
detEltsUFM :: forall k k0 a. Ord k => UniqFM k0 (k, a) -> [(k, a)]
detEltsUFM = forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall key elt. UniqFM key elt -> [elt]
nonDetEltsUFM

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

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