@@ -28,23 +28,24 @@ module Data.Aeson.Types
2828 , object
2929 ) where
3030
31−import Control.Monad (MonadPlus(..), ap, liftM)
3231import Control.Arrow ((***))
3332import Control.DeepSeq (NFData(..))
33+import Control.Monad (MonadPlus(..), ap, liftM)
34+import Data.Data (Data)
3435import Data.Map (Map)
35−import qualified Data.ByteString as B
36−import qualified Data.ByteString.Lazy as LB
37−import Data.Text.Encoding (decodeUtf8, encodeUtf8)
36+import Data.Monoid (Dual(..), First(..), Last(..))
3837import Data.Text (Text, pack, unpack)
39−import qualified Data.Text.Lazy as LT
38+import Data.Text.Encoding (decodeUtf8, encodeUtf8)
4039import Data.Time.Clock (UTCTime)
4140import Data.Time.Format (formatTime, parseTime)
4241import Data.Typeable (Typeable)
43−import Data.Data (Data)
4442import Data.Vector (Vector)
4543import System.Locale (defaultTimeLocale)
44+import qualified Data.ByteString as B
45+import qualified Data.ByteString.Lazy as LB
4646import qualified Data.Map as M
4747import qualified Data.Set as Set
48+import qualified Data.Text.Lazy as LT
4849import qualified Data.Vector as V
4950
5051-- | A JSON \"object\" (key\/value map).
@@ -330,6 +331,30 @@ instance (FromJSON a, FromJSON b) => FromJSON (a,b) where
330331 fromJSON _ = empty
331332 {-# INLINE fromJSON #-}
332333
334+instance ToJSON a => ToJSON (Dual a) where
335+ toJSON = toJSON . getDual
336+ {-# INLINE toJSON #-}
337+
338+instance FromJSON a => FromJSON (Dual a) where
339+ fromJSON = liftM Dual . fromJSON
340+ {-# INLINE fromJSON #-}
341+
342+instance ToJSON a => ToJSON (First a) where
343+ toJSON = toJSON . getFirst
344+ {-# INLINE toJSON #-}
345+
346+instance FromJSON a => FromJSON (First a) where
347+ fromJSON = liftM First . fromJSON
348+ {-# INLINE fromJSON #-}
349+
350+instance ToJSON a => ToJSON (Last a) where
351+ toJSON = toJSON . getLast
352+ {-# INLINE toJSON #-}
353+
354+instance FromJSON a => FromJSON (Last a) where
355+ fromJSON = liftM Last . fromJSON
356+ {-# INLINE fromJSON #-}
357+
333358-- | Transform one map into another. The ordering of keys must be
334359-- preserved.
335360transformMap :: (Ord k1, Ord k2) => (k1 -> k2) -> (v1 -> v2)