{-# OPTIONS_GHC -cpp -fglasgow-exts #-}
{- For Hugs, use the option -F"cpp -P -traditional" -}

module LinearScan.IntMap where


import Debug.Trace (trace, traceShow)
import qualified Prelude
import qualified Data.IntMap
import qualified Data.IntSet
import qualified Data.List
import qualified Data.Ord
import qualified Data.Functor.Identity
import qualified LinearScan.Utils

import qualified LinearScan.Lib as Lib



--unsafeCoerce :: a -> b
#ifdef __GLASGOW_HASKELL__
import qualified GHC.Base as GHC.Base
unsafeCoerce = GHC.Base.unsafeCoerce#
#else
-- HUGS
import qualified LinearScan.IOExts as IOExts
unsafeCoerce = IOExts.unsafeCoerce
#endif

emptyIntMap :: Data.IntMap.IntMap a1
emptyIntMap =
  Data.IntMap.fromList []

coq_IntSet_forFold :: a1 -> Data.IntSet.IntSet -> (a1 -> Prelude.Int -> a1)
                      -> a1
coq_IntSet_forFold z m f =
  Data.IntSet.foldl' f z m

coq_IntMap_groupOn :: (a1 -> Prelude.Int) -> ([] a1) -> Data.IntMap.IntMap
                      ([] a1)
coq_IntMap_groupOn p l =
  Lib.forFold emptyIntMap l (\acc x ->
    let {n = p x} in
    Data.IntMap.alter (\mxs ->
      case mxs of {
       Prelude.Just xs -> Prelude.Just ((:) x xs);
       Prelude.Nothing -> Prelude.Just ((:) x [])}) n acc)