ZkUOD      !"#$%&'()*+,-./0123456789:;<=>?@ABC Various utilty functions(c) Will Sewell, 2015MITme@willsewell.com experimentalNoneDWhen decoding Aeson values, this can be used to return a failing parser when an object was expected, but it was a different type of data.EGeneralised version of showDEDEDE"Types representing Pusher messages(c) Will Sewell, 2015MITme@willsewell.com experimentalNone0CFMThe data about a user returned when querying for users in a presence channel.EA list of users returned by querying for users in a presence channel.;The possible values returned by a query to a single channel [The possible returned channel attributes when multiple when multiple channels are queried. dA map of channels to their ChannelInfo. The result of querying channel info from multuple channels.)A set of requested ChannelInfoAttributes.IEnumeration of the attributes that can be queried about a single channel.*A set of requested ChannelsInfoAttributes.JEnumeration of the attributes that can be queried about multiple channels.F>Types that can be serialised to a querystring parameter value.4Convert the data into a querystring parameter value.FThe channel name (not including the channel type prefix) and its type.$The possible types of Pusher channe.#BConvert string representation, e.g. private-chan into the datatype3 F !"#GHIJKLMNOPQRST$  !"#$    #"!  F !"#GHIJKLMNOPQRST%Data structure to store Pusher config(c) Will Sewell, 2015MITme@willsewell.com experimentalNone$$The credentials for the current app.)?All the required configuration needed to interact with the API./WUse this to get an instance Pusher. This will fill in the host and path automatically.08Get a Pusher instance that uses a specific API endpoint.1Get a Pusher instance with a given connection manager. This can be useful if you want to share a connection with your application code.$%&'()*+,-./01UV$%&'()*+,-./01)*+,-.$%&'(/01$%&'()*+,-./01UV>Functions to perform authentication (generate auth signatures)(c) Will Sewell, 2015MITme@willsewell.com experimentalNone42WGenerate the required query string parameters required to send API requests to Pusher.WHRender key-value tuple mapping of query string parameters into a string.XJCreate a Pusher auth signature of a string using the provided credentials.3[Generate an auth signature of the form "app_key:auth_sig" for a user of a private channel.4\Generate an auth signature of the form "app_key:auth_sig" for a user of a presence channel.5As above, but allows the encoder of the user data to be specified. This is useful for testing because the encoder can be mocked; aeson's encoder enodes JSON object fields in arbitrary orders, which makes it impossible to test.2Any additional parametersCurrent UNIX timestampWX345The encoder of the user data.234545322WX3454Typclass for IO monads that can get the current time(c) Will Sewell, 2015MITme@willsewell.com experimentalNone67YZ[676767YZ[3Typclass for IO monads that can issue HTTP requests(c) Will Sewell, 2015MITme@willsewell.com experimentalNone8XThese functions essentially abstract the corresponding functions from the Wreq library.89\]^898989\]^#Functions for issuing HTTP requests(c) Will Sewell, 2015MITme@willsewell.com experimentalNone4F:Issue an HTTP GET request. On a 200 response, the response body is returned. On failure, an error will be thrown into the MonadError instance.;Issue an HTTP POST request._cMake a request by building up an http-client Request data structure, and performing the IO action.:The API endpoint, for example (http://api.pusherapp.com/apps/123/events3List of query string parameters as key-value tuplesThe body of the response;_`a89:;89:;:;_`aEMonad type aliases for the return types of the external API functions(c) Will Sewell, 2015MITme@willsewell.com experimentalNone&4<]Typeclass alias for the return type of the API functions (keeps the signatures less verbose)=6Use this if you wish to stack this on your own monads.>DMonad that can be used as the return type of the main API functions.?1Run the monadic Pusher code to extract the result<=>?<=>?<>=?<=>?(Haskell interface to the Pusher HTTP API(c) Will Sewell, 2015MITme@willsewell.com experimentalNone&4@)Trigger an event to one or more channels.A)Query a list of channels for information.B*Query for information on a single channel.C*Get a list of users in a presence channel.bABuild a full endpoint from the details in Pusher and the subPath.cDImpure wrapper around makeQS which gets the current time implicitly.@"The list of channels to trigger to The event%The data to send (often encoded JSON)9An optional socket ID of a connection you wish to excludeAFilter by the type of channel&A channel prefix you wish to filter on9Data you wish to query for, currently just the user countThe returned dataB=Can query user count and also subscription count (if enabled)Cb>The subpath of the specific request, e.g "events/channel-name".The full endpoint, and just the path componentc34@ABC@ABC43@ABCbcd        !"#$%&&'()**+,-./0123456789:;<=>?@ABC D EFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdpushe_3MX5JJT4ZUqI415hVAixrjNetwork.Pusher.Protocol Data.PusherNetwork.Pusher.Internal.AuthControl.Monad.Pusher.TimeControl.Monad.Pusher.HTTPNetwork.Pusher.Internal.HTTPControl.Monad.PusherNetwork.PusherNetwork.Pusher.Internal.UtilUseruserIDUsersFullChannelInfofullChannelInfoOccupiedfullChannelInfoUserCountfullChannelInfoSubCount ChannelInfochannelInfoUserCount ChannelsInfoChannelInfoQueryChannelInfoAttributesChannelUserCountChannelSubscriptionCountChannelsInfoQueryChannelsInfoAttributesChannelsUserCount toURLParamChannel channelType channelName ChannelTypePublicPrivatePresencerenderChannelPrefix renderChannel parseChannel CredentialscredentialsAppIDcredentialsAppKeycredentialsAppSecretPusher pusherHost pusherPathpusherCredentialspusherConnectionManager getPushergetPusherWithHostgetPusherWithConnManagermakeQSauthenticatePrivateauthenticatePresenceauthenticatePresenceWithEncoder MonadTime getPOSIXTime MonadHTTPhttpLbsgetpost MonadPusherPusherTPusherM runPusherTtriggerchannelschannelusers failExpectObjshow' ToURLParam$fFromJSONUser$fFromJSONUsers$fFromJSONFullChannelInfo$fFromJSONChannelInfo$fFromJSONChannelsInfo$fToURLParamHashSet$fHashableChannelInfoAttributes!$fToURLParamChannelInfoAttributes $fHashableChannelsInfoAttributes"$fToURLParamChannelsInfoAttributes$fArbitraryChannel$fHashableChannel$fArbitraryChannelType$fHashableChannelTypegetConnManager$fFromJSONCredentialsformQueryString authSignature$fMonadTimeExceptT$fMonadTimeReaderT $fMonadTimeIO$fMonadHTTPExceptT$fMonadHTTPReaderT $fMonadHTTPIO makeRequestwhen200 errorOn200 getEndpoint makeQSWithTS