@@ -27,32 +27,33 @@
2727module Network.PagerDuty.Internal.Types where
2828
2929import Control.Applicative
30−import Control.Lens hiding ((.=))
30+import Control.Lens hiding ((.=), Empty)
3131import Control.Monad.IO.Class
32−import Data.Aeson hiding (Error)
32+import Data.Aeson hiding (Error, Key)
33+import qualified Data.Aeson.KeyMap as Map
3334import Data.Aeson.Types (Parser)
3435import Data.ByteString (ByteString)
3536import qualified Data.ByteString.Char8 as BS
3637import Data.ByteString.Conversion hiding (List)
3738import Data.Default.Class
3839import Data.Function (on)
39−import qualified Data.HashMap.Strict as Map
4040import Data.List (deleteBy, intersperse)
4141import Data.Monoid
4242import Data.String
4343import Data.Text (Text)
4444import qualified Data.Text as Text
4545import qualified Data.Text.Encoding as Text
46−import Data.Time
46+import Data.Time (UTCTime, TimeZone, formatTime, utc, timeZoneName)
4747import GHC.TypeLits
4848import Network.HTTP.Client (Manager)
4949import Network.HTTP.Types
5050import Network.HTTP.Types.QueryLike
5151import Network.PagerDuty.Internal.Query
5252import Network.PagerDuty.Internal.TH
53+import Data.Time.Locale.Compat
5354
5455newtype CSV a = CSV [a]
55− deriving (Eq, Show, Monoid)
56+ deriving (Eq, Show, Semigroup, Monoid)
5657
5758makePrisms ''CSV
5859
@@ -69,7 +70,7 @@ instance ToByteString a => ToJSON (CSV a) where
6970 toJSON = String . Text.decodeUtf8 . toByteString'
7071
7172newtype List a = L [a]
72− deriving (Eq, Show, Monoid)
73+ deriving (Eq, Show, Semigroup, Monoid)
7374
7475deriveJSON ''List
7576makePrisms ''List
@@ -105,7 +106,7 @@ instance ToJSON Date where
105106
106107instance ToByteString Date where
107108 builder (D d) = builder
108− (formatTime defaultTimeLocale (iso8601DateFormat $ Just "%XZ") d)
109+ (formatTime defaultTimeLocale ("%Y-%m-%dT%XZ") d)
109110
110111instance QueryValues Date
111112
@@ -132,8 +133,8 @@ data Security = Basic | Token
132133 deriving (Eq, Show)
133134
134135data Auth (a :: Security) where
135− AuthBasic :: ByteString -> ByteString -> Auth Basic
136− AuthToken :: ByteString -> Auth Token
136+ AuthBasic :: ByteString -> ByteString -> Auth 'Basic
137+ AuthToken :: ByteString -> Auth 'Token
137138
138139deriving instance Eq (Auth a)
139140deriving instance Show (Auth a)
@@ -278,8 +279,13 @@ data Pager = Pager
278279
279280makeLenses ''Pager
280281
281−instance FromJSON a => FromJSON (a, Maybe Pager) where
282− parseJSON = withObject "paginated" $ \o -> (,)
282+data Page a = Page
283+ { _pgItem :: a
284+ , _pgPager :: Maybe Pager
285+ }
286+
287+instance FromJSON a => FromJSON (Page a) where
288+ parseJSON = withObject "paginated" $ \o -> Page
283289 <$> parseJSON (Object o)
284290 <*> optional (parse o)
285291 where
@@ -304,11 +310,13 @@ data Path where
304310 Path :: Path
305311 Seg :: ToByteString a => a -> Path
306312
313+instance Semigroup Path where
314+ x <> Path = x
315+ Path <> y = y
316+ Seg x <> Seg y = Seg (builder x <> "/" <> builder y)
317+
307318instance Monoid Path where
308− mempty = Path
309− mappend x Path = x
310− mappend Path y = y
311− mappend (Seg x) (Seg y) = Seg (builder x <> "/" <> builder y)
319+ mempty = Path
312320
313321instance IsString Path where
314322 fromString = Seg