-- Copyright (c) 2013 Eric McCorkle.  All rights reserved.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions
-- are met:
--
-- 1. Redistributions of source code must retain the above copyright
--    notice, this list of conditions and the following disclaimer.
--
-- 2. Redistributions in binary form must reproduce the above copyright
--    notice, this list of conditions and the following disclaimer in the
--    documentation and/or other materials provided with the distribution.
--
-- 3. Neither the name of the author nor the names of any contributors
--    may be used to endorse or promote products derived from this software
--    without specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS''
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-- PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS
-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-- USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-- OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-- SUCH DAMAGE.
{-# OPTIONS_GHC -Wall -Werror -fno-warn-orphans #-}
{-# LANGUAGE FlexibleInstances, FlexibleContexts, UndecidableInstances #-}

-- | This module contains extra instances for prelude-extras.
module Prelude.Extras.ExtraInstances where

import Data.Array(Array)
import Data.List
import Data.Map(Map)
import Prelude.Extras

import qualified Data.Array as Array
import qualified Data.HashMap.Strict as Strict

instance Eq2 Map
instance Eq k => Eq1 (Map k)
instance Eq2 Strict.HashMap
instance Eq k => Eq1 (Strict.HashMap k)
instance (Eq i, Array.Ix i) => Eq1 (Array i)

instance Ord2 Map
instance Ord k => Ord1 (Map k)
instance Ord2 Strict.HashMap
instance Ord k => Ord1 (Strict.HashMap k)
instance (Ord i, Array.Ix i) => Ord1 (Array i)

instance (Ord k, Ord v) => Ord (Strict.HashMap k v) where
  compare m1 m2 =
    let
      list1 = sort (Strict.toList m1)
      list2 = sort (Strict.toList m2)
    in
      compare1 list1 list2
