Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Make Value an instance of Hashable.

  • Loading branch information...
commit d972405af65830854e3a81791d808e2965ccc446 1 parent 86e92d9
@bos authored
Showing with 10 additions and 0 deletions.
  1. +10 −0 Data/Aeson/Types.hs
View
10 Data/Aeson/Types.hs
@@ -45,7 +45,9 @@ import Control.Monad (MonadPlus(..), ap)
import Data.Aeson.Functions
import Data.Attoparsec.Char8 (Number(..))
import Data.Data (Data)
+import Data.Hashable (Hashable(..))
import Data.Int (Int8, Int16, Int32, Int64)
+import Data.List (foldl')
import Data.Map (Map)
import Data.Monoid (Dual(..), First(..), Last(..))
import Data.Monoid (Monoid(..))
@@ -201,6 +203,14 @@ instance IsString Value where
fromString = String . pack
{-# INLINE fromString #-}
+instance Hashable Value where
+ hash (Object o) = foldl' hashWithSalt 0 . M.toList $ o
+ hash (Array a) = V.foldl' hashWithSalt 1 a
+ hash (String s) = 2 `hashWithSalt` s
+ hash (Number n) = 3 `hashWithSalt` case n of I i -> hash i; D d -> hash d
+ hash (Bool b) = 4 `hashWithSalt` b
+ hash Null = 5
+
-- | The empty array.
emptyArray :: Value
emptyArray = Array V.empty
Please sign in to comment.
Something went wrong with that request. Please try again.