acousticbrainz-client-0.1.0.0: src/AcousticBrainz/FiniteDistribution.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TupleSections #-}
module AcousticBrainz.FiniteDistribution where
import Data.Aeson
import Data.Aeson.Types
import Data.Scientific
newtype FiniteDistribution a = FiniteDistribution (Map a Scientific)
deriving instance Eq a => Eq (FiniteDistribution a)
deriving instance Ord a => Ord (FiniteDistribution a)
deriving instance (Ord a, Read a) => Read (FiniteDistribution a)
deriving instance Show a => Show (FiniteDistribution a)
parseFiniteDistribution :: Ord a => [(a, Text)] -> Value -> Parser (FiniteDistribution a)
parseFiniteDistribution valueKeys = withObject "all" $ \v ->
FiniteDistribution . fromList <$> sequence (do
(value, name) <- valueKeys
return $ (value,) <$> v .: name
)