twitter-conduit 0.0.5.8 → 0.0.6
raw patch · 20 files changed
+647/−459 lines, 20 filesdep ~lensdep ~twitter-typesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: lens, twitter-types
API changes (from Hackage documentation)
- Web.Twitter.Conduit: MediaFromFile :: FilePath -> MediaData
- Web.Twitter.Conduit: MediaRequestBody :: FilePath -> RequestBody -> MediaData
- Web.Twitter.Conduit: data MediaData
- Web.Twitter.Conduit.Parameters.Internal: booleanQuery :: Prism' ByteString Bool
- Web.Twitter.Conduit.Parameters.Internal: class Parameters a
- Web.Twitter.Conduit.Parameters.Internal: integerArrayQuery :: Prism' ByteString [Integer]
- Web.Twitter.Conduit.Parameters.Internal: params :: Parameters a => Lens' a SimpleQuery
- Web.Twitter.Conduit.Parameters.Internal: readShow :: (Read a, Show a) => Prism' ByteString a
- Web.Twitter.Conduit.Parameters.Internal: wrappedParam :: Parameters p => ByteString -> Prism' ByteString a -> Lens' p (Maybe a)
- Web.Twitter.Conduit.Parameters.TH: defineHasParamClass'' :: String -> String -> String -> TypeQ -> Name -> Q [Dec]
- Web.Twitter.Conduit.Types: FromJSONError :: String -> TwitterError
- Web.Twitter.Conduit.Types: MediaFromFile :: FilePath -> MediaData
- Web.Twitter.Conduit.Types: MediaRequestBody :: FilePath -> RequestBody -> MediaData
- Web.Twitter.Conduit.Types: Response :: Status -> ResponseHeaders -> responseType -> Response responseType
- Web.Twitter.Conduit.Types: TwitterErrorMessage :: Int -> Text -> TwitterErrorMessage
- Web.Twitter.Conduit.Types: TwitterErrorResponse :: Status -> ResponseHeaders -> [TwitterErrorMessage] -> TwitterError
- Web.Twitter.Conduit.Types: TwitterStatusError :: Status -> ResponseHeaders -> Value -> TwitterError
- Web.Twitter.Conduit.Types: WithCursor :: Integer -> Integer -> [wrapped] -> WithCursor cursorKey wrapped
- Web.Twitter.Conduit.Types: class CursorKey a
- Web.Twitter.Conduit.Types: contents :: WithCursor cursorKey wrapped -> [wrapped]
- Web.Twitter.Conduit.Types: cursorKey :: CursorKey a => a -> Text
- Web.Twitter.Conduit.Types: data IdsCursorKey
- Web.Twitter.Conduit.Types: data MediaData
- Web.Twitter.Conduit.Types: data Response responseType
- Web.Twitter.Conduit.Types: data TwitterError
- Web.Twitter.Conduit.Types: data TwitterErrorMessage
- Web.Twitter.Conduit.Types: data UsersCursorKey
- Web.Twitter.Conduit.Types: data WithCursor cursorKey wrapped
- Web.Twitter.Conduit.Types: instance (FromJSON wrapped, CursorKey c) => FromJSON (WithCursor c wrapped)
- Web.Twitter.Conduit.Types: instance CursorKey IdsCursorKey
- Web.Twitter.Conduit.Types: instance CursorKey UsersCursorKey
- Web.Twitter.Conduit.Types: instance Data TwitterErrorMessage
- Web.Twitter.Conduit.Types: instance Enum TwitterErrorMessage
- Web.Twitter.Conduit.Types: instance Eq TwitterError
- Web.Twitter.Conduit.Types: instance Eq TwitterErrorMessage
- Web.Twitter.Conduit.Types: instance Eq responseType => Eq (Response responseType)
- Web.Twitter.Conduit.Types: instance Exception TwitterError
- Web.Twitter.Conduit.Types: instance Foldable Response
- Web.Twitter.Conduit.Types: instance FromJSON TwitterErrorMessage
- Web.Twitter.Conduit.Types: instance Functor Response
- Web.Twitter.Conduit.Types: instance Ord TwitterErrorMessage
- Web.Twitter.Conduit.Types: instance Show TwitterError
- Web.Twitter.Conduit.Types: instance Show TwitterErrorMessage
- Web.Twitter.Conduit.Types: instance Show responseType => Show (Response responseType)
- Web.Twitter.Conduit.Types: instance Show wrapped => Show (WithCursor cursorKey wrapped)
- Web.Twitter.Conduit.Types: instance Traversable Response
- Web.Twitter.Conduit.Types: instance Typeable TwitterError
- Web.Twitter.Conduit.Types: instance Typeable TwitterErrorMessage
- Web.Twitter.Conduit.Types: instance Typeable1 Response
- Web.Twitter.Conduit.Types: nextCursor :: WithCursor cursorKey wrapped -> Integer
- Web.Twitter.Conduit.Types: previousCursor :: WithCursor cursorKey wrapped -> Integer
- Web.Twitter.Conduit.Types: responseBody :: Response responseType -> responseType
- Web.Twitter.Conduit.Types: responseHeaders :: Response responseType -> ResponseHeaders
- Web.Twitter.Conduit.Types: responseStatus :: Response responseType -> Status
- Web.Twitter.Conduit.Types: twitterErrorCode :: TwitterErrorMessage -> Int
- Web.Twitter.Conduit.Types: twitterErrorMessage :: TwitterErrorMessage -> Text
- Web.Twitter.Conduit.Types.Lens: contents :: Lens (WithCursor cursorKey_aamU wrapped_aamV) (WithCursor cursorKey_acQ1 wrapped_acQ2) [wrapped_aamV] [wrapped_acQ2]
- Web.Twitter.Conduit.Types.Lens: data Response responseType
- Web.Twitter.Conduit.Types.Lens: data TwitterErrorMessage
- Web.Twitter.Conduit.Types.Lens: data WithCursor cursorKey wrapped
- Web.Twitter.Conduit.Types.Lens: nextCursor :: Lens (WithCursor cursorKey_aamU wrapped_aamV) (WithCursor cursorKey_acQ3 wrapped_aamV) Integer Integer
- Web.Twitter.Conduit.Types.Lens: previousCursor :: Lens (WithCursor cursorKey_aamU wrapped_aamV) (WithCursor cursorKey_acQ4 wrapped_aamV) Integer Integer
- Web.Twitter.Conduit.Types.Lens: responseBody :: Lens (Response responseType_aakM) (Response responseType_acQL) responseType_aakM responseType_acQL
- Web.Twitter.Conduit.Types.Lens: responseHeaders :: Lens' (Response responseType_aakM) ResponseHeaders
- Web.Twitter.Conduit.Types.Lens: responseStatus :: Lens' (Response responseType_aakM) Status
- Web.Twitter.Conduit.Types.Lens: twitterErrorCode :: Lens' TwitterErrorMessage Int
- Web.Twitter.Conduit.Types.Lens: twitterErrorMessage :: Lens' TwitterErrorMessage Text
- Web.Twitter.Conduit.Types.TH: makeLenses :: Name -> Q [Dec]
+ Web.Twitter.Conduit.Api: data ListsCreate
+ Web.Twitter.Conduit.Api: data ListsDestroy
+ Web.Twitter.Conduit.Api: data ListsMembersCreate
+ Web.Twitter.Conduit.Api: data ListsMembersDestroy
+ Web.Twitter.Conduit.Api: data ListsMemberships
+ Web.Twitter.Conduit.Api: data ListsOwnerships
+ Web.Twitter.Conduit.Api: data ListsShow
+ Web.Twitter.Conduit.Api: data ListsStatuses
+ Web.Twitter.Conduit.Api: data ListsSubscribers
+ Web.Twitter.Conduit.Api: data ListsSubscriptions
+ Web.Twitter.Conduit.Api: data ListsUpdate
+ Web.Twitter.Conduit.Api: instance HasCountParam (APIRequest ListsMemberships a0)
+ Web.Twitter.Conduit.Api: instance HasCountParam (APIRequest ListsOwnerships a0)
+ Web.Twitter.Conduit.Api: instance HasCountParam (APIRequest ListsStatuses a0)
+ Web.Twitter.Conduit.Api: instance HasCountParam (APIRequest ListsSubscribers a0)
+ Web.Twitter.Conduit.Api: instance HasCountParam (APIRequest ListsSubscriptions a0)
+ Web.Twitter.Conduit.Api: instance HasCursorParam (APIRequest ListsMemberships a0)
+ Web.Twitter.Conduit.Api: instance HasCursorParam (APIRequest ListsOwnerships a0)
+ Web.Twitter.Conduit.Api: instance HasCursorParam (APIRequest ListsSubscribers a0)
+ Web.Twitter.Conduit.Api: instance HasCursorParam (APIRequest ListsSubscriptions a0)
+ Web.Twitter.Conduit.Api: instance HasIncludeEntitiesParam (APIRequest ListsStatuses a0)
+ Web.Twitter.Conduit.Api: instance HasIncludeRtsParam (APIRequest ListsStatuses a0)
+ Web.Twitter.Conduit.Api: instance HasMaxIdParam (APIRequest ListsStatuses a0)
+ Web.Twitter.Conduit.Api: instance HasSinceIdParam (APIRequest ListsStatuses a0)
+ Web.Twitter.Conduit.Api: instance HasSkipStatusParam (APIRequest ListsSubscribers a0)
+ Web.Twitter.Conduit.Api: listsCreate :: Text -> Bool -> Maybe Text -> APIRequest ListsCreate List
+ Web.Twitter.Conduit.Api: listsDestroy :: ListParam -> APIRequest ListsDestroy List
+ Web.Twitter.Conduit.Api: listsMembersCreate :: ListParam -> UserParam -> APIRequest ListsMembersCreate List
+ Web.Twitter.Conduit.Api: listsMembersDestroy :: ListParam -> UserParam -> APIRequest ListsMembersDestroy List
+ Web.Twitter.Conduit.Api: listsMemberships :: Maybe UserParam -> APIRequest ListsMemberships (WithCursor ListsCursorKey List)
+ Web.Twitter.Conduit.Api: listsOwnerships :: Maybe UserParam -> APIRequest ListsOwnerships (WithCursor ListsCursorKey List)
+ Web.Twitter.Conduit.Api: listsShow :: ListParam -> APIRequest ListsShow List
+ Web.Twitter.Conduit.Api: listsStatuses :: ListParam -> APIRequest ListsStatuses [Status]
+ Web.Twitter.Conduit.Api: listsSubscribers :: ListParam -> APIRequest ListsSubscribers (WithCursor UsersCursorKey User)
+ Web.Twitter.Conduit.Api: listsSubscriptions :: Maybe UserParam -> APIRequest ListsSubscriptions (WithCursor ListsCursorKey List)
+ Web.Twitter.Conduit.Api: listsUpdate :: ListParam -> Bool -> Maybe Text -> APIRequest ListsUpdate List
+ Web.Twitter.Conduit.Cursor: WithCursor :: Integer -> Integer -> [wrapped] -> WithCursor cursorKey wrapped
+ Web.Twitter.Conduit.Cursor: class CursorKey a
+ Web.Twitter.Conduit.Cursor: contents :: WithCursor cursorKey wrapped -> [wrapped]
+ Web.Twitter.Conduit.Cursor: cursorKey :: CursorKey a => a -> Text
+ Web.Twitter.Conduit.Cursor: data IdsCursorKey
+ Web.Twitter.Conduit.Cursor: data ListsCursorKey
+ Web.Twitter.Conduit.Cursor: data UsersCursorKey
+ Web.Twitter.Conduit.Cursor: data WithCursor cursorKey wrapped
+ Web.Twitter.Conduit.Cursor: instance (FromJSON wrapped, CursorKey c) => FromJSON (WithCursor c wrapped)
+ Web.Twitter.Conduit.Cursor: instance CursorKey IdsCursorKey
+ Web.Twitter.Conduit.Cursor: instance CursorKey ListsCursorKey
+ Web.Twitter.Conduit.Cursor: instance CursorKey UsersCursorKey
+ Web.Twitter.Conduit.Cursor: instance Show wrapped => Show (WithCursor cursorKey wrapped)
+ Web.Twitter.Conduit.Cursor: nextCursor :: WithCursor cursorKey wrapped -> Integer
+ Web.Twitter.Conduit.Cursor: previousCursor :: WithCursor cursorKey wrapped -> Integer
+ Web.Twitter.Conduit.Lens: FromJSONError :: String -> TwitterError
+ Web.Twitter.Conduit.Lens: TwitterErrorResponse :: Status -> ResponseHeaders -> [TwitterErrorMessage] -> TwitterError
+ Web.Twitter.Conduit.Lens: TwitterStatusError :: Status -> ResponseHeaders -> Value -> TwitterError
+ Web.Twitter.Conduit.Lens: class CursorKey a
+ Web.Twitter.Conduit.Lens: contents :: Lens (WithCursor cursorKey a) (WithCursor cursorKey b) [a] [b]
+ Web.Twitter.Conduit.Lens: cursorKey :: CursorKey a => a -> Text
+ Web.Twitter.Conduit.Lens: data IdsCursorKey
+ Web.Twitter.Conduit.Lens: data ListsCursorKey
+ Web.Twitter.Conduit.Lens: data Response responseType
+ Web.Twitter.Conduit.Lens: data TwitterError
+ Web.Twitter.Conduit.Lens: data TwitterErrorMessage
+ Web.Twitter.Conduit.Lens: data UsersCursorKey
+ Web.Twitter.Conduit.Lens: data WithCursor cursorKey wrapped
+ Web.Twitter.Conduit.Lens: nextCursor :: Lens' (WithCursor cursorKey wrapped) Integer
+ Web.Twitter.Conduit.Lens: previousCursor :: Lens' (WithCursor cursorKey wrapped) Integer
+ Web.Twitter.Conduit.Lens: responseBody :: Lens (Response a) (Response b) a b
+ Web.Twitter.Conduit.Lens: responseHeaders :: Lens' (Response responseType) ResponseHeaders
+ Web.Twitter.Conduit.Lens: responseStatus :: Lens' (Response responseType) Status
+ Web.Twitter.Conduit.Lens: twitterErrorCode :: Lens' TwitterErrorMessage Int
+ Web.Twitter.Conduit.Lens: twitterErrorMessage :: Lens' TwitterErrorMessage Text
+ Web.Twitter.Conduit.Parameters: MediaFromFile :: FilePath -> MediaData
+ Web.Twitter.Conduit.Parameters: MediaRequestBody :: FilePath -> RequestBody -> MediaData
+ Web.Twitter.Conduit.Parameters: PVBool :: Bool -> PV
+ Web.Twitter.Conduit.Parameters: PVDay :: Day -> PV
+ Web.Twitter.Conduit.Parameters: PVInteger :: Integer -> PV
+ Web.Twitter.Conduit.Parameters: PVIntegerArray :: [Integer] -> PV
+ Web.Twitter.Conduit.Parameters: PVString :: Text -> PV
+ Web.Twitter.Conduit.Parameters: PVStringArray :: [Text] -> PV
+ Web.Twitter.Conduit.Parameters: data MediaData
+ Web.Twitter.Conduit.Parameters: data PV
+ Web.Twitter.Conduit.Parameters: makeSimpleQuery :: APIQuery -> SimpleQuery
+ Web.Twitter.Conduit.Parameters: type APIQuery = [APIQueryItem]
+ Web.Twitter.Conduit.Parameters: type APIQueryItem = (ByteString, PV)
+ Web.Twitter.Conduit.Parameters: unPVBool :: PV -> Bool
+ Web.Twitter.Conduit.Parameters: unPVDay :: PV -> Day
+ Web.Twitter.Conduit.Parameters: unPVInteger :: PV -> Integer
+ Web.Twitter.Conduit.Parameters: unPVIntegerArray :: PV -> [Integer]
+ Web.Twitter.Conduit.Parameters: unPVString :: PV -> Text
+ Web.Twitter.Conduit.Parameters: unPVStringArray :: PV -> [Text]
+ Web.Twitter.Conduit.Parameters.TH: defineHasParamClassBool :: String -> Q [Dec]
+ Web.Twitter.Conduit.Parameters.TH: defineHasParamClassDay :: String -> Q [Dec]
+ Web.Twitter.Conduit.Parameters.TH: defineHasParamClassInteger :: String -> Q [Dec]
+ Web.Twitter.Conduit.Parameters.TH: defineHasParamClassIntegerArray :: String -> Q [Dec]
+ Web.Twitter.Conduit.Parameters.TH: defineHasParamClassString :: String -> Q [Dec]
+ Web.Twitter.Conduit.Parameters.TH: defineHasParamClassStringArray :: String -> Q [Dec]
+ Web.Twitter.Conduit.Parameters.TH: wrappedParam :: Parameters p => ByteString -> (a -> PV) -> (PV -> a) -> Lens' p (Maybe a)
+ Web.Twitter.Conduit.Request: PVBool :: Bool -> PV
+ Web.Twitter.Conduit.Request: PVDay :: Day -> PV
+ Web.Twitter.Conduit.Request: PVInteger :: Integer -> PV
+ Web.Twitter.Conduit.Request: PVIntegerArray :: [Integer] -> PV
+ Web.Twitter.Conduit.Request: PVString :: Text -> PV
+ Web.Twitter.Conduit.Request: PVStringArray :: [Text] -> PV
+ Web.Twitter.Conduit.Request: class Parameters a
+ Web.Twitter.Conduit.Request: data PV
+ Web.Twitter.Conduit.Request: instance Eq PV
+ Web.Twitter.Conduit.Request: instance Show PV
+ Web.Twitter.Conduit.Request: makeSimpleQuery :: APIQuery -> SimpleQuery
+ Web.Twitter.Conduit.Request: paramValueBS :: PV -> ByteString
+ Web.Twitter.Conduit.Request: params :: Parameters a => Lens' a APIQuery
+ Web.Twitter.Conduit.Request: type APIQuery = [APIQueryItem]
+ Web.Twitter.Conduit.Request: type APIQueryItem = (ByteString, PV)
+ Web.Twitter.Conduit.Request: unPVBool :: PV -> Bool
+ Web.Twitter.Conduit.Request: unPVDay :: PV -> Day
+ Web.Twitter.Conduit.Request: unPVInteger :: PV -> Integer
+ Web.Twitter.Conduit.Request: unPVIntegerArray :: PV -> [Integer]
+ Web.Twitter.Conduit.Request: unPVString :: PV -> Text
+ Web.Twitter.Conduit.Request: unPVStringArray :: PV -> [Text]
+ Web.Twitter.Conduit.Response: FromJSONError :: String -> TwitterError
+ Web.Twitter.Conduit.Response: Response :: Status -> ResponseHeaders -> responseType -> Response responseType
+ Web.Twitter.Conduit.Response: TwitterErrorMessage :: Int -> Text -> TwitterErrorMessage
+ Web.Twitter.Conduit.Response: TwitterErrorResponse :: Status -> ResponseHeaders -> [TwitterErrorMessage] -> TwitterError
+ Web.Twitter.Conduit.Response: TwitterStatusError :: Status -> ResponseHeaders -> Value -> TwitterError
+ Web.Twitter.Conduit.Response: data Response responseType
+ Web.Twitter.Conduit.Response: data TwitterError
+ Web.Twitter.Conduit.Response: data TwitterErrorMessage
+ Web.Twitter.Conduit.Response: instance Data TwitterErrorMessage
+ Web.Twitter.Conduit.Response: instance Enum TwitterErrorMessage
+ Web.Twitter.Conduit.Response: instance Eq TwitterError
+ Web.Twitter.Conduit.Response: instance Eq TwitterErrorMessage
+ Web.Twitter.Conduit.Response: instance Eq responseType => Eq (Response responseType)
+ Web.Twitter.Conduit.Response: instance Exception TwitterError
+ Web.Twitter.Conduit.Response: instance Foldable Response
+ Web.Twitter.Conduit.Response: instance FromJSON TwitterErrorMessage
+ Web.Twitter.Conduit.Response: instance Functor Response
+ Web.Twitter.Conduit.Response: instance Ord TwitterErrorMessage
+ Web.Twitter.Conduit.Response: instance Show TwitterError
+ Web.Twitter.Conduit.Response: instance Show TwitterErrorMessage
+ Web.Twitter.Conduit.Response: instance Show responseType => Show (Response responseType)
+ Web.Twitter.Conduit.Response: instance Traversable Response
+ Web.Twitter.Conduit.Response: instance Typeable Response
+ Web.Twitter.Conduit.Response: instance Typeable TwitterError
+ Web.Twitter.Conduit.Response: instance Typeable TwitterErrorMessage
+ Web.Twitter.Conduit.Response: responseBody :: Response responseType -> responseType
+ Web.Twitter.Conduit.Response: responseHeaders :: Response responseType -> ResponseHeaders
+ Web.Twitter.Conduit.Response: responseStatus :: Response responseType -> Status
+ Web.Twitter.Conduit.Response: twitterErrorCode :: TwitterErrorMessage -> Int
+ Web.Twitter.Conduit.Response: twitterErrorMessage :: TwitterErrorMessage -> Text
- Web.Twitter.Conduit.Parameters: class Parameters a_adf4 => HasContributorDetailsParam a_adf4 where contributorDetails = wrappedParam "contributor_details" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_akm9 => HasContributorDetailsParam a_akm9 where contributorDetails = wrappedParam "contributor_details" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_ad9b => HasCountParam a_ad9b where count = wrappedParam "count" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_akhb => HasCountParam a_akhb where count = wrappedParam "count" PVInteger unPVInteger
- Web.Twitter.Conduit.Parameters: class Parameters a_adcB => HasCursorParam a_adcB where cursor = wrappedParam "cursor" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_akk1 => HasCursorParam a_akk1 where cursor = wrappedParam "cursor" PVInteger unPVInteger
- Web.Twitter.Conduit.Parameters: class Parameters a_adjX => HasDisplayCoordinatesParam a_adjX where displayCoordinates = wrappedParam "display_coordinates" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_akqp => HasDisplayCoordinatesParam a_akqp where displayCoordinates = wrappedParam "display_coordinates" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_adeg => HasExcludeRepliesParam a_adeg where excludeReplies = wrappedParam "exclude_replies" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_aklr => HasExcludeRepliesParam a_aklr where excludeReplies = wrappedParam "exclude_replies" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_adoQ => HasFollowParam a_adoQ where follow = wrappedParam "follow" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_akuF => HasFollowParam a_akuF where follow = wrappedParam "follow" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_adj6 => HasInReplyToStatusIdParam a_adj6 where inReplyToStatusId = wrappedParam "in_reply_to_status_id" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_akpH => HasInReplyToStatusIdParam a_akpH where inReplyToStatusId = wrappedParam "in_reply_to_status_id" PVInteger unPVInteger
- Web.Twitter.Conduit.Parameters: class Parameters a_adfS => HasIncludeEntitiesParam a_adfS where includeEntities = wrappedParam "include_entities" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_akmR => HasIncludeEntitiesParam a_akmR where includeEntities = wrappedParam "include_entities" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_adii => HasIncludeMyRetweetParam a_adii where includeMyRetweet = wrappedParam "include_my_retweet" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_akoZ => HasIncludeMyRetweetParam a_akoZ where includeMyRetweet = wrappedParam "include_my_retweet" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_adhu => HasIncludeRtsParam a_adhu where includeRts = wrappedParam "include_rts" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_akoh => HasIncludeRtsParam a_akoh where includeRts = wrappedParam "include_rts" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_adgG => HasIncludeUserEntitiesParam a_adgG where includeUserEntities = wrappedParam "include_user_entities" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_aknz => HasIncludeUserEntitiesParam a_aknz where includeUserEntities = wrappedParam "include_user_entities" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_adlz => HasLangParam a_adlz where lang = wrappedParam "lang" utf8
+ Web.Twitter.Conduit.Parameters: class Parameters a_akrP => HasLangParam a_akrP where lang = wrappedParam "lang" PVString unPVString
- Web.Twitter.Conduit.Parameters: class Parameters a_admn => HasLocaleParam a_admn where locale = wrappedParam "locale" utf8
+ Web.Twitter.Conduit.Parameters: class Parameters a_aksx => HasLocaleParam a_aksx where locale = wrappedParam "locale" PVString unPVString
- Web.Twitter.Conduit.Parameters: class Parameters a_adpE => HasMapParam a_adpE where map = wrappedParam "map" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_akvn => HasMapParam a_akvn where map = wrappedParam "map" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_adaT => HasMaxIdParam a_adaT where maxId = wrappedParam "max_id" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_akiB => HasMaxIdParam a_akiB where maxId = wrappedParam "max_id" PVInteger unPVInteger
- Web.Twitter.Conduit.Parameters: class Parameters a_adqw => HasMediaIdsParam a_adqw where mediaIds = wrappedParam "media_ids" integerArrayQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_akw5 => HasMediaIdsParam a_akw5 where mediaIds = wrappedParam "media_ids" PVIntegerArray unPVIntegerArray
- Web.Twitter.Conduit.Parameters: class Parameters a_adbK => HasPageParam a_adbK where page = wrappedParam "page" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_akjj => HasPageParam a_akjj where page = wrappedParam "page" PVInteger unPVInteger
- Web.Twitter.Conduit.Parameters: class Parameters a_adkL => HasPossiblySensitiveParam a_adkL where possiblySensitive = wrappedParam "possibly_sensitive" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_akr7 => HasPossiblySensitiveParam a_akr7 where possiblySensitive = wrappedParam "possibly_sensitive" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_ada2 => HasSinceIdParam a_ada2 where sinceId = wrappedParam "since_id" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_akhT => HasSinceIdParam a_akhT where sinceId = wrappedParam "since_id" PVInteger unPVInteger
- Web.Twitter.Conduit.Parameters: class Parameters a_ado2 => HasSkipStatusParam a_ado2 where skipStatus = wrappedParam "skip_status" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_aktX => HasSkipStatusParam a_aktX where skipStatus = wrappedParam "skip_status" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_adds => HasTrimUserParam a_adds where trimUser = wrappedParam "trim_user" booleanQuery
+ Web.Twitter.Conduit.Parameters: class Parameters a_akkJ => HasTrimUserParam a_akkJ where trimUser = wrappedParam "trim_user" PVBool unPVBool
- Web.Twitter.Conduit.Parameters: class Parameters a_adnb => HasUntilParam a_adnb where until = wrappedParam "until" readShow
+ Web.Twitter.Conduit.Parameters: class Parameters a_aktf => HasUntilParam a_aktf where until = wrappedParam "until" PVDay unPVDay
- Web.Twitter.Conduit.Parameters: contributorDetails :: HasContributorDetailsParam a_adf4 => Lens' a_adf4 (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: contributorDetails :: HasContributorDetailsParam a_akm9 => Lens' a_akm9 (Maybe Bool)
- Web.Twitter.Conduit.Parameters: count :: HasCountParam a_ad9b => Lens' a_ad9b (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: count :: HasCountParam a_akhb => Lens' a_akhb (Maybe Integer)
- Web.Twitter.Conduit.Parameters: cursor :: HasCursorParam a_adcB => Lens' a_adcB (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: cursor :: HasCursorParam a_akk1 => Lens' a_akk1 (Maybe Integer)
- Web.Twitter.Conduit.Parameters: displayCoordinates :: HasDisplayCoordinatesParam a_adjX => Lens' a_adjX (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: displayCoordinates :: HasDisplayCoordinatesParam a_akqp => Lens' a_akqp (Maybe Bool)
- Web.Twitter.Conduit.Parameters: excludeReplies :: HasExcludeRepliesParam a_adeg => Lens' a_adeg (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: excludeReplies :: HasExcludeRepliesParam a_aklr => Lens' a_aklr (Maybe Bool)
- Web.Twitter.Conduit.Parameters: follow :: HasFollowParam a_adoQ => Lens' a_adoQ (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: follow :: HasFollowParam a_akuF => Lens' a_akuF (Maybe Bool)
- Web.Twitter.Conduit.Parameters: inReplyToStatusId :: HasInReplyToStatusIdParam a_adj6 => Lens' a_adj6 (Maybe StatusId)
+ Web.Twitter.Conduit.Parameters: inReplyToStatusId :: HasInReplyToStatusIdParam a_akpH => Lens' a_akpH (Maybe Integer)
- Web.Twitter.Conduit.Parameters: includeEntities :: HasIncludeEntitiesParam a_adfS => Lens' a_adfS (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: includeEntities :: HasIncludeEntitiesParam a_akmR => Lens' a_akmR (Maybe Bool)
- Web.Twitter.Conduit.Parameters: includeMyRetweet :: HasIncludeMyRetweetParam a_adii => Lens' a_adii (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: includeMyRetweet :: HasIncludeMyRetweetParam a_akoZ => Lens' a_akoZ (Maybe Bool)
- Web.Twitter.Conduit.Parameters: includeRts :: HasIncludeRtsParam a_adhu => Lens' a_adhu (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: includeRts :: HasIncludeRtsParam a_akoh => Lens' a_akoh (Maybe Bool)
- Web.Twitter.Conduit.Parameters: includeUserEntities :: HasIncludeUserEntitiesParam a_adgG => Lens' a_adgG (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: includeUserEntities :: HasIncludeUserEntitiesParam a_aknz => Lens' a_aknz (Maybe Bool)
- Web.Twitter.Conduit.Parameters: lang :: HasLangParam a_adlz => Lens' a_adlz (Maybe Text)
+ Web.Twitter.Conduit.Parameters: lang :: HasLangParam a_akrP => Lens' a_akrP (Maybe Text)
- Web.Twitter.Conduit.Parameters: locale :: HasLocaleParam a_admn => Lens' a_admn (Maybe Text)
+ Web.Twitter.Conduit.Parameters: locale :: HasLocaleParam a_aksx => Lens' a_aksx (Maybe Text)
- Web.Twitter.Conduit.Parameters: map :: HasMapParam a_adpE => Lens' a_adpE (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: map :: HasMapParam a_akvn => Lens' a_akvn (Maybe Bool)
- Web.Twitter.Conduit.Parameters: maxId :: HasMaxIdParam a_adaT => Lens' a_adaT (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: maxId :: HasMaxIdParam a_akiB => Lens' a_akiB (Maybe Integer)
- Web.Twitter.Conduit.Parameters: mediaIds :: HasMediaIdsParam a_adqw => Lens' a_adqw (Maybe [Integer])
+ Web.Twitter.Conduit.Parameters: mediaIds :: HasMediaIdsParam a_akw5 => Lens' a_akw5 (Maybe [Integer])
- Web.Twitter.Conduit.Parameters: mkListParam :: ListParam -> SimpleQuery
+ Web.Twitter.Conduit.Parameters: mkListParam :: ListParam -> APIQuery
- Web.Twitter.Conduit.Parameters: mkUserListParam :: UserListParam -> SimpleQuery
+ Web.Twitter.Conduit.Parameters: mkUserListParam :: UserListParam -> APIQuery
- Web.Twitter.Conduit.Parameters: mkUserParam :: UserParam -> SimpleQuery
+ Web.Twitter.Conduit.Parameters: mkUserParam :: UserParam -> APIQuery
- Web.Twitter.Conduit.Parameters: page :: HasPageParam a_adbK => Lens' a_adbK (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: page :: HasPageParam a_akjj => Lens' a_akjj (Maybe Integer)
- Web.Twitter.Conduit.Parameters: params :: Parameters a => Lens' a SimpleQuery
+ Web.Twitter.Conduit.Parameters: params :: Parameters a => Lens' a APIQuery
- Web.Twitter.Conduit.Parameters: possiblySensitive :: HasPossiblySensitiveParam a_adkL => Lens' a_adkL (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: possiblySensitive :: HasPossiblySensitiveParam a_akr7 => Lens' a_akr7 (Maybe Bool)
- Web.Twitter.Conduit.Parameters: sinceId :: HasSinceIdParam a_ada2 => Lens' a_ada2 (Maybe Integer)
+ Web.Twitter.Conduit.Parameters: sinceId :: HasSinceIdParam a_akhT => Lens' a_akhT (Maybe Integer)
- Web.Twitter.Conduit.Parameters: skipStatus :: HasSkipStatusParam a_ado2 => Lens' a_ado2 (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: skipStatus :: HasSkipStatusParam a_aktX => Lens' a_aktX (Maybe Bool)
- Web.Twitter.Conduit.Parameters: trimUser :: HasTrimUserParam a_adds => Lens' a_adds (Maybe Bool)
+ Web.Twitter.Conduit.Parameters: trimUser :: HasTrimUserParam a_akkJ => Lens' a_akkJ (Maybe Bool)
- Web.Twitter.Conduit.Parameters: until :: HasUntilParam a_adnb => Lens' a_adnb (Maybe Day)
+ Web.Twitter.Conduit.Parameters: until :: HasUntilParam a_aktf => Lens' a_aktf (Maybe Day)
- Web.Twitter.Conduit.Parameters.TH: defineHasParamClass :: String -> Name -> Name -> Q [Dec]
+ Web.Twitter.Conduit.Parameters.TH: defineHasParamClass :: Name -> Name -> TypeQ -> String -> Q [Dec]
- Web.Twitter.Conduit.Parameters.TH: defineHasParamClass' :: String -> TypeQ -> Name -> Q [Dec]
+ Web.Twitter.Conduit.Parameters.TH: defineHasParamClass' :: String -> String -> Name -> Name -> TypeQ -> String -> Q [Dec]
- Web.Twitter.Conduit.Request: APIRequestGet :: String -> SimpleQuery -> APIRequest apiName responseType
+ Web.Twitter.Conduit.Request: APIRequestGet :: String -> APIQuery -> APIRequest apiName responseType
- Web.Twitter.Conduit.Request: APIRequestPost :: String -> SimpleQuery -> APIRequest apiName responseType
+ Web.Twitter.Conduit.Request: APIRequestPost :: String -> APIQuery -> APIRequest apiName responseType
- Web.Twitter.Conduit.Request: APIRequestPostMultipart :: String -> SimpleQuery -> [Part] -> APIRequest apiName responseType
+ Web.Twitter.Conduit.Request: APIRequestPostMultipart :: String -> APIQuery -> [Part] -> APIRequest apiName responseType
- Web.Twitter.Conduit.Request: _params :: APIRequest apiName responseType -> SimpleQuery
+ Web.Twitter.Conduit.Request: _params :: APIRequest apiName responseType -> APIQuery
Files
- Web/Twitter/Conduit.hs +14/−11
- Web/Twitter/Conduit/Api.hs +258/−24
- Web/Twitter/Conduit/Base.hs +5/−6
- Web/Twitter/Conduit/Cursor.hs +70/−0
- Web/Twitter/Conduit/Lens.hs +62/−0
- Web/Twitter/Conduit/Monad.hs +0/−3
- Web/Twitter/Conduit/Parameters.hs +51/−50
- Web/Twitter/Conduit/Parameters/Internal.hs +0/−94
- Web/Twitter/Conduit/Parameters/TH.hs +51/−14
- Web/Twitter/Conduit/Request.hs +50/−13
- Web/Twitter/Conduit/Response.hs +61/−0
- Web/Twitter/Conduit/Status.hs +4/−12
- Web/Twitter/Conduit/Stream.hs +4/−8
- Web/Twitter/Conduit/Types.hs +0/−154
- Web/Twitter/Conduit/Types/Lens.hs +0/−37
- Web/Twitter/Conduit/Types/TH.hs +0/−18
- sample/Common.hs +0/−0
- sample/userstream.hs +2/−2
- tests/ApiSpec.hs +1/−1
- twitter-conduit.cabal +14/−12
Web/Twitter/Conduit.hs view
@@ -17,15 +17,16 @@ -- $howto -- * Re-exports- module Web.Twitter.Conduit.Base- , module Web.Twitter.Conduit.Api- , module Web.Twitter.Conduit.Status+ module Web.Twitter.Conduit.Api+ , module Web.Twitter.Conduit.Base+ , module Web.Twitter.Conduit.Cursor , module Web.Twitter.Conduit.Monad- , module Web.Twitter.Conduit.Stream- , module Web.Twitter.Conduit.Request , module Web.Twitter.Conduit.Parameters+ , module Web.Twitter.Conduit.Request+ , module Web.Twitter.Conduit.Response+ , module Web.Twitter.Conduit.Status+ , module Web.Twitter.Conduit.Stream - , MediaData (..) #if !MIN_VERSION_twitter_types(0,5,0) , UploadedMedia , mediaId@@ -38,14 +39,15 @@ #endif ) where -import Web.Twitter.Conduit.Types-import Web.Twitter.Conduit.Base import Web.Twitter.Conduit.Api-import Web.Twitter.Conduit.Status+import Web.Twitter.Conduit.Base+import Web.Twitter.Conduit.Cursor import Web.Twitter.Conduit.Monad-import Web.Twitter.Conduit.Stream-import Web.Twitter.Conduit.Request import Web.Twitter.Conduit.Parameters+import Web.Twitter.Conduit.Request+import Web.Twitter.Conduit.Response+import Web.Twitter.Conduit.Status+import Web.Twitter.Conduit.Stream -- for haddock import Web.Authenticate.OAuth@@ -72,6 +74,7 @@ -- > {-# LANGUAGE OverloadedStrings #-} -- > -- > import Web.Twitter.Conduit+-- > import Web.Twitter.Types -- > import Web.Authenticate.OAuth -- > import Data.Conduit -- > import qualified Data.Conduit.List as CL
Web/Twitter/Conduit/Api.hs view
@@ -2,11 +2,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE CPP #-}-#if __GLASGOW_HASKELL__ >= 704-{-# LANGUAGE ConstraintKinds #-}-#endif module Web.Twitter.Conduit.Api (@@ -95,25 +91,36 @@ -- * Lists -- , listsList- -- , listsStatuses- -- , listsMembersDestroy- -- , listsMemberships- -- , listsSubscribers+ , ListsStatuses+ , listsStatuses+ , ListsMembersDestroy+ , listsMembersDestroy+ , ListsMemberships+ , listsMemberships+ , ListsSubscribers+ , listsSubscribers -- , listsSubscribersCreate -- , listsSubscribersShow -- , listsSubscribersDestroy- -- , listsSubscribersCreateAll+ -- , listsMembersCreateAll -- , listsMembersShow , ListsMembers , listsMembers- -- , listsMembersCreate- -- , listsDestroy- -- , listsUpdate- -- , listsCreate- -- , listsShow- -- , listsSubscriptions+ , ListsMembersCreate+ , listsMembersCreate+ , ListsDestroy+ , listsDestroy+ , ListsUpdate+ , listsUpdate+ , ListsCreate+ , listsCreate+ , ListsShow+ , listsShow+ , ListsSubscriptions+ , listsSubscriptions -- , listsMembersDestroyAll- -- , listsOwnerships+ , ListsOwnerships+ , listsOwnerships -- * Saved Searches -- savedSearchesList@@ -134,15 +141,14 @@ ) where import Web.Twitter.Types-import Web.Twitter.Conduit.Types import Web.Twitter.Conduit.Parameters import Web.Twitter.Conduit.Parameters.TH import Web.Twitter.Conduit.Base import Web.Twitter.Conduit.Request+import Web.Twitter.Conduit.Cursor import Network.HTTP.Client.MultipartFormData import qualified Data.Text as T-import qualified Data.Text.Encoding as T import Data.Default -- $setup@@ -165,7 +171,7 @@ -- APIRequestGet "https://api.twitter.com/1.1/search/tweets.json" [("count","100"),("lang","ja"),("q","search text")] searchTweets :: T.Text -- ^ search string -> APIRequest SearchTweets (SearchResult [SearchStatus])-searchTweets q = APIRequestGet (endpoint ++ "search/tweets.json") [("q", T.encodeUtf8 q)]+searchTweets q = APIRequestGet (endpoint ++ "search/tweets.json") [("q", PVString q)] deriveHasParamInstances ''SearchTweets [ "lang" , "locale"@@ -242,7 +248,7 @@ -- >>> directMessagesShow 1234567890 -- APIRequestGet "https://api.twitter.com/1.1/direct_messages/show.json" [("id","1234567890")] directMessagesShow :: StatusId -> APIRequest DirectMessagesShow DirectMessage-directMessagesShow sId = APIRequestGet (endpoint ++ "direct_messages/show.json") [("id", showBS sId)]+directMessagesShow sId = APIRequestGet (endpoint ++ "direct_messages/show.json") [("id", PVInteger sId)] data DirectMessagesDestroy -- | Returns post data which destroys the direct message specified in the required ID parameter.@@ -256,7 +262,7 @@ -- >>> directMessagesDestroy 1234567890 -- APIRequestPost "https://api.twitter.com/1.1/direct_messages/destroy.json" [("id","1234567890")] directMessagesDestroy :: StatusId -> APIRequest DirectMessagesDestroy DirectMessage-directMessagesDestroy sId = APIRequestPost (endpoint ++ "direct_messages/destroy.json") [("id", showBS sId)]+directMessagesDestroy sId = APIRequestPost (endpoint ++ "direct_messages/destroy.json") [("id", PVInteger sId)] deriveHasParamInstances ''DirectMessagesDestroy [ "include_entities" ]@@ -275,7 +281,7 @@ -- >>> directMessagesNew (UserIdParam 69179963) "Hello thimura! by UserId" -- APIRequestPost "https://api.twitter.com/1.1/direct_messages/new.json" [("text","Hello thimura! by UserId"),("user_id","69179963")] directMessagesNew :: UserParam -> T.Text -> APIRequest DirectMessagesNew DirectMessage-directMessagesNew q msg = APIRequestPost (endpoint ++ "direct_messages/new.json") (("text", T.encodeUtf8 msg):mkUserParam q)+directMessagesNew q msg = APIRequestPost (endpoint ++ "direct_messages/new.json") (("text", PVString msg):mkUserParam q) data FriendshipsNoRetweetsIds -- | Returns a collection of user_ids that the currently authenticated user does not want to receive retweets from.@@ -575,7 +581,7 @@ -- >>> favoritesCreate 1234567890 -- APIRequestPost "https://api.twitter.com/1.1/favorites/create.json" [("id","1234567890")] favoritesCreate :: StatusId -> APIRequest FavoritesCreate Status-favoritesCreate sid = APIRequestPost (endpoint ++ "favorites/create.json") [("id", showBS sid)]+favoritesCreate sid = APIRequestPost (endpoint ++ "favorites/create.json") [("id", PVInteger sid)] deriveHasParamInstances ''FavoritesCreate [ "include_entities" ]@@ -592,11 +598,143 @@ -- >>> favoritesDestroy 1234567890 -- APIRequestPost "https://api.twitter.com/1.1/favorites/destroy.json" [("id","1234567890")] favoritesDestroy :: StatusId -> APIRequest FavoritesDestroy Status-favoritesDestroy sid = APIRequestPost (endpoint ++ "favorites/destroy.json") [("id", showBS sid)]+favoritesDestroy sid = APIRequestPost (endpoint ++ "favorites/destroy.json") [("id", PVInteger sid)] deriveHasParamInstances ''FavoritesDestroy [ "include_entities" ] +data ListsStatuses+-- | Returns the query parameter which fetches a timeline of tweets authored by members of the specified list.+--+-- You can perform request by using 'call':+--+-- @+-- res <- 'call' '$' 'listsStatuses' ('ListNameParam' "thimura/haskell")+-- @+--+-- If you need more statuses, you can obtain those by using 'sourceWithMaxId':+-- @+-- res <- sourceWithMaxId ('listsStatuses' ('ListNameParam' "thimura/haskell") & count ?~ 200) $$ CL.take 1000+-- @+--+-- >>> listsStatuses (ListNameParam "thimura/haskell")+-- APIRequestGet "https://api.twitter.com/1.1/lists/statuses.json" [("slug","haskell"),("owner_screen_name","thimura")]+-- >>> listsStatuses (ListIdParam 20849097)+-- APIRequestGet "https://api.twitter.com/1.1/lists/statuses.json" [("list_id","20849097")]+listsStatuses :: ListParam -> APIRequest ListsStatuses [Status]+listsStatuses q = APIRequestGet (endpoint ++ "lists/statuses.json") (mkListParam q)+deriveHasParamInstances ''ListsStatuses+ [ "since_id"+ , "max_id"+ , "count"+ , "include_entities"+ , "include_rts"+ ]++data ListsMembersDestroy+-- | Returns the post parameter which removes the specified member from the list.+--+-- You can perform request by using 'call':+--+-- @+-- res <- 'call' '$' 'listsMembersDestroy' ('ListNameParam' "thimura/haskell") ('ScreenNameParam' "thimura")+-- @+--+-- >>> listsMembersDestroy (ListNameParam "thimura/haskell") (ScreenNameParam "thimura")+-- APIRequestPost "https://api.twitter.com/1.1/lists/members/destroy.json" [("slug","haskell"),("owner_screen_name","thimura"),("screen_name","thimura")]+-- >>> listsMembersDestroy (ListIdParam 20849097) (UserIdParam 69179963)+-- APIRequestPost "https://api.twitter.com/1.1/lists/members/destroy.json" [("list_id","20849097"),("user_id","69179963")]+listsMembersDestroy :: ListParam -> UserParam -> APIRequest ListsMembersDestroy List+listsMembersDestroy list user = APIRequestPost (endpoint ++ "lists/members/destroy.json") (mkListParam list ++ mkUserParam user)++data ListsMemberships+-- | Returns the request parameters which asks the lists the specified user has been added to.+-- If 'UserParam' are not provided, the memberships for the authenticating user are returned.+--+-- You can perform request by using 'call':+--+-- @+-- res <- 'call' '$' 'listsMemberships' ('ListNameParam' "thimura/haskell")+-- @+--+-- >>> listsMemberships Nothing+-- APIRequestGet "https://api.twitter.com/1.1/lists/memberships.json" []+-- >>> listsMemberships (Just (ScreenNameParam "thimura"))+-- APIRequestGet "https://api.twitter.com/1.1/lists/memberships.json" [("screen_name","thimura")]+-- >>> listsMemberships (Just (UserIdParam 69179963))+-- APIRequestGet "https://api.twitter.com/1.1/lists/memberships.json" [("user_id","69179963")]+listsMemberships :: Maybe UserParam -> APIRequest ListsMemberships (WithCursor ListsCursorKey List)+listsMemberships q = APIRequestGet (endpoint ++ "lists/memberships.json") $ maybe [] mkUserParam q+deriveHasParamInstances ''ListsMemberships+ [ "cursor"+ , "count"+ ]++data ListsSubscribers+-- | Returns the request parameter which asks the subscribers of the specified list.+--+-- You can perform request by using 'call':+--+-- @+-- res <- 'call' '$' 'listsSubscribers' ('ListNameParam' "thimura/haskell")+-- @+--+-- >>> listsSubscribers (ListNameParam "thimura/haskell")+-- APIRequestGet "https://api.twitter.com/1.1/lists/subscribers.json" [("slug","haskell"),("owner_screen_name","thimura")]+-- >>> listsSubscribers (ListIdParam 20849097)+-- APIRequestGet "https://api.twitter.com/1.1/lists/subscribers.json" [("list_id","20849097")]+listsSubscribers :: ListParam -> APIRequest ListsSubscribers (WithCursor UsersCursorKey User)+listsSubscribers q = APIRequestGet (endpoint ++ "lists/subscribers.json") (mkListParam q)+deriveHasParamInstances ''ListsSubscribers+ [ "cursor"+ , "count"+ , "skip_status"+ ]++data ListsSubscriptions+-- | Returns the request parameter which obtains a collection of the lists the specified user is subscribed to.+--+-- You can perform request by using 'call':+--+-- @+-- res <- 'call' '$' 'listsSubscriptions' ('ListNameParam' "thimura/haskell")+-- @+--+-- >>> listsSubscriptions Nothing+-- APIRequestGet "https://api.twitter.com/1.1/lists/subscriptions.json" []+-- >>> listsSubscriptions (Just (ScreenNameParam "thimura"))+-- APIRequestGet "https://api.twitter.com/1.1/lists/subscriptions.json" [("screen_name","thimura")]+-- >>> listsSubscriptions (Just (UserIdParam 69179963))+-- APIRequestGet "https://api.twitter.com/1.1/lists/subscriptions.json" [("user_id","69179963")]+listsSubscriptions :: Maybe UserParam -> APIRequest ListsSubscriptions (WithCursor ListsCursorKey List)+listsSubscriptions q = APIRequestGet (endpoint ++ "lists/subscriptions.json") $ maybe [] mkUserParam q+deriveHasParamInstances ''ListsSubscriptions+ [ "cursor"+ , "count"+ ]++data ListsOwnerships+-- | Returns the request parameter which asks the lists owned by the specified Twitter user.+--+-- You can perform request by using 'call':+--+-- @+-- res <- 'call' '$' 'listsOwnerships' ('ListNameParam' "thimura/haskell")+-- @+--+-- >>> listsOwnerships Nothing+-- APIRequestGet "https://api.twitter.com/1.1/lists/ownerships.json" []+-- >>> listsOwnerships (Just (ScreenNameParam "thimura"))+-- APIRequestGet "https://api.twitter.com/1.1/lists/ownerships.json" [("screen_name","thimura")]+-- >>> listsOwnerships (Just (UserIdParam 69179963))+-- APIRequestGet "https://api.twitter.com/1.1/lists/ownerships.json" [("user_id","69179963")]+listsOwnerships :: Maybe UserParam -> APIRequest ListsOwnerships (WithCursor ListsCursorKey List)+listsOwnerships q = APIRequestGet (endpoint ++ "lists/ownerships.json") $ maybe [] mkUserParam q+deriveHasParamInstances ''ListsOwnerships+ [ "cursor"+ , "count"+ ]+ data ListsMembers -- | Returns query data asks the members of the specified list. --@@ -616,6 +754,102 @@ [ "cursor" , "skip_status" ]++data ListsMembersCreate+-- | Returns the post parameter which adds a member to a list.+--+-- You can perform request by using 'call':+--+-- @+-- res <- 'call' '$' 'listsMembersCreate' ('ListNameParam' "thimura/haskell") ('ScreenNameParam' "thimura")+-- @+--+-- >>> listsMembersCreate (ListNameParam "thimura/haskell") (ScreenNameParam "thimura")+-- APIRequestPost "https://api.twitter.com/1.1/lists/members/create.json" [("slug","haskell"),("owner_screen_name","thimura"),("screen_name","thimura")]+-- >>> listsMembersCreate (ListIdParam 20849097) (UserIdParam 69179963)+-- APIRequestPost "https://api.twitter.com/1.1/lists/members/create.json" [("list_id","20849097"),("user_id","69179963")]+listsMembersCreate :: ListParam -> UserParam -> APIRequest ListsMembersCreate List+listsMembersCreate list user = APIRequestPost (endpoint ++ "lists/members/create.json") (mkListParam list ++ mkUserParam user)++data ListsDestroy+-- | Returns the post parameter which deletes the specified list.+--+-- You can perform request by using 'call':+--+-- @+-- res <- 'call' '$' 'listsDestroy' ('ListNameParam' "thimura/haskell")+-- @+--+-- >>> listsDestroy (ListNameParam "thimura/haskell")+-- APIRequestPost "https://api.twitter.com/1.1/lists/destroy.json" [("slug","haskell"),("owner_screen_name","thimura")]+-- >>> listsDestroy (ListIdParam 20849097)+-- APIRequestPost "https://api.twitter.com/1.1/lists/destroy.json" [("list_id","20849097")]+listsDestroy :: ListParam -> APIRequest ListsDestroy List+listsDestroy list = APIRequestPost (endpoint ++ "lists/destroy.json") (mkListParam list)++data ListsUpdate+-- | Returns the post parameter which updates the specified list.+--+-- You can perform request by using 'call':+--+-- @+-- res <- 'call' '$' 'listsUpdate' ('ListNameParam' "thimura/haskell") True (Just "Haskellers")+-- @+--+-- >>> listsUpdate (ListNameParam "thimura/haskell") True (Just "Haskellers")+-- APIRequestPost "https://api.twitter.com/1.1/lists/update.json" [("slug","haskell"),("owner_screen_name","thimura"),("description","Haskellers"),("mode","public")]+listsUpdate :: ListParam+ -> Bool -- ^ is public+ -> Maybe T.Text -- ^ description+ -> APIRequest ListsUpdate List+listsUpdate list isPublic description = APIRequestPost (endpoint ++ "lists/update.json") (mkListParam list ++ p')+ where+ p = [("mode", PVString . mode $ isPublic)]+ p' = maybe id (\d -> (("description", PVString d):)) description p+ mode True = "public"+ mode False = "private"++data ListsCreate+-- | Returns the post parameter which creates a new list for the authenticated user.+--+-- You can perform request by using 'call':+--+-- @+-- res <- 'call' '$' 'listsCreate' ('ListNameParam' "thimura/haskell")+-- @+--+-- >>> listsCreate "haskell" True Nothing+-- APIRequestPost "https://api.twitter.com/1.1/lists/create.json" [("name","haskell"),("mode","public")]+-- >>> listsCreate "haskell" False Nothing+-- APIRequestPost "https://api.twitter.com/1.1/lists/create.json" [("name","haskell"),("mode","private")]+-- >>> listsCreate "haskell" True (Just "Haskellers")+-- APIRequestPost "https://api.twitter.com/1.1/lists/create.json" [("description","Haskellers"),("name","haskell"),("mode","public")]+listsCreate :: T.Text -- ^ list name+ -> Bool -- ^ whether public(True) or private(False)+ -> Maybe T.Text -- ^ the description to give the list+ -> APIRequest ListsCreate List+listsCreate name isPublic description = APIRequestPost (endpoint ++ "lists/create.json") p'+ where+ p = [("name", PVString name), ("mode", PVString . mode $ isPublic)]+ p' = maybe id (\d -> (("description", PVString d):)) description p+ mode True = "public"+ mode False = "private"++data ListsShow+-- | Returns the request parameter which asks the specified list.+--+-- You can perform request by using 'call':+--+-- @+-- res <- 'call' '$' 'listsShow' ('ListNameParam' "thimura/haskell")+-- @+--+-- >>> listsShow (ListNameParam "thimura/haskell")+-- APIRequestGet "https://api.twitter.com/1.1/lists/show.json" [("slug","haskell"),("owner_screen_name","thimura")]+-- >>> listsShow (ListIdParam 20849097)+-- APIRequestGet "https://api.twitter.com/1.1/lists/show.json" [("list_id","20849097")]+listsShow :: ListParam -> APIRequest ListsShow List+listsShow q = APIRequestGet (endpoint ++ "lists/show.json") (mkListParam q) data MediaUpload -- | Upload media and returns the media data.
Web/Twitter/Conduit/Base.hs view
@@ -1,8 +1,6 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE CPP #-} {-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE RecordWildCards #-} @@ -25,9 +23,10 @@ ) where import Web.Twitter.Conduit.Monad-import Web.Twitter.Conduit.Types import Web.Twitter.Conduit.Parameters import Web.Twitter.Conduit.Request+import Web.Twitter.Conduit.Response+import Web.Twitter.Conduit.Cursor import Web.Twitter.Types.Lens import qualified Network.HTTP.Conduit as HTTP@@ -57,13 +56,13 @@ makeRequest :: (MonadThrow m, MonadIO m) => APIRequest apiName responseType -> m HTTP.Request-makeRequest (APIRequestGet u pa) = makeRequest' "GET" u pa-makeRequest (APIRequestPost u pa) = makeRequest' "POST" u pa+makeRequest (APIRequestGet u pa) = makeRequest' "GET" u (makeSimpleQuery pa)+makeRequest (APIRequestPost u pa) = makeRequest' "POST" u (makeSimpleQuery pa) makeRequest (APIRequestPostMultipart u param prt) = formDataBody body =<< makeRequest' "POST" u [] where body = prt ++ partParam- partParam = Prelude.map (uncurry partBS . over _1 T.decodeUtf8) param+ partParam = Prelude.map (uncurry partBS . over _1 T.decodeUtf8) (makeSimpleQuery param) makeRequest' :: MonadThrow m => HT.Method -- ^ HTTP request method (GET or POST)
+ Web/Twitter/Conduit/Cursor.hs view
@@ -0,0 +1,70 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE EmptyDataDecls #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-}++module Web.Twitter.Conduit.Cursor+ ( CursorKey (..)+ , IdsCursorKey+ , UsersCursorKey+ , ListsCursorKey+ , WithCursor (..)+ ) where++import Control.Applicative+import Data.Aeson+import Data.Monoid+import Data.Text (Text)+import Web.Twitter.Types (checkError)++-- $setup+-- >>> type UserId = Integer++class CursorKey a where+ cursorKey :: a -> Text++-- | Phantom type to specify the key which point out the content in the response.+data IdsCursorKey+instance CursorKey IdsCursorKey where+ cursorKey = const "ids"++-- | Phantom type to specify the key which point out the content in the response.+data UsersCursorKey+instance CursorKey UsersCursorKey where+ cursorKey = const "users"++-- | Phantom type to specify the key which point out the content in the response.+data ListsCursorKey+instance CursorKey ListsCursorKey where+ cursorKey = const "lists"++#if __GLASGOW_HASKELL__ >= 706+-- | A wrapper for API responses which have "next_cursor" field.+--+-- The first type parameter of 'WithCursor' specifies the field name of contents.+--+-- >>> let Just res = decode "{\"previous_cursor\": 0, \"next_cursor\": 1234567890, \"ids\": [1111111111]}" :: Maybe (WithCursor IdsCursorKey UserId)+-- >>> nextCursor res+-- 1234567890+-- >>> contents res+-- [1111111111]+--+-- >>> let Just res = decode "{\"previous_cursor\": 0, \"next_cursor\": 0, \"users\": [1000]}" :: Maybe (WithCursor UsersCursorKey UserId)+-- >>> nextCursor res+-- 0+-- >>> contents res+-- [1000]+#endif+data WithCursor cursorKey wrapped = WithCursor+ { previousCursor :: Integer+ , nextCursor :: Integer+ , contents :: [wrapped]+ } deriving Show++instance (FromJSON wrapped, CursorKey c) =>+ FromJSON (WithCursor c wrapped) where+ parseJSON (Object o) = checkError o >>+ WithCursor <$> o .: "previous_cursor"+ <*> o .: "next_cursor"+ <*> o .: cursorKey (undefined :: c)+ parseJSON _ = mempty
+ Web/Twitter/Conduit/Lens.hs view
@@ -0,0 +1,62 @@+{-# LANGUAGE RankNTypes #-}++module Web.Twitter.Conduit.Lens+ (+ -- * 'TT.Response'+ TT.Response+ , responseStatus+ , responseBody+ , responseHeaders+ -- * 'TT.TwitterErrorMessage'+ , TT.TwitterErrorMessage+ , twitterErrorMessage+ , twitterErrorCode++ -- * 'TT.WithCursor'+ , TT.WithCursor+ , previousCursor+ , nextCursor+ , contents++ -- * Re-exports+ , TT.TwitterError(..)+ , TT.CursorKey (..)+ , TT.IdsCursorKey+ , TT.UsersCursorKey+ , TT.ListsCursorKey+ ) where++import Control.Applicative+import Control.Lens+import Data.Text (Text)+import Network.HTTP.Types (Status, ResponseHeaders)+import qualified Web.Twitter.Conduit.Cursor as TT+import qualified Web.Twitter.Conduit.Response as TT++-- * Lenses for 'TT.Response'+responseStatus :: forall responseType. Lens' (TT.Response responseType) Status+responseStatus afb s = (\b -> s { TT.responseStatus = b }) <$> afb (TT.responseStatus s)++responseHeaders :: forall responseType. Lens' (TT.Response responseType) ResponseHeaders+responseHeaders afb s = (\b -> s {TT.responseHeaders = b }) <$> afb (TT.responseHeaders s)++responseBody :: forall a b. Lens (TT.Response a) (TT.Response b) a b+responseBody afb s = (\b -> s { TT.responseBody = b }) <$> afb (TT.responseBody s)++-- * Lenses for 'TT.TwitterErrorMessage'++twitterErrorCode :: Lens' TT.TwitterErrorMessage Int+twitterErrorCode afb s = (\b -> s { TT.twitterErrorCode = b }) <$> afb (TT.twitterErrorCode s)++twitterErrorMessage :: Lens' TT.TwitterErrorMessage Text+twitterErrorMessage afb s = (\b -> s { TT.twitterErrorMessage = b }) <$> afb (TT.twitterErrorMessage s)++-- * Lenses for 'TT.WithCursor'+previousCursor :: forall cursorKey wrapped. Lens' (TT.WithCursor cursorKey wrapped) Integer+previousCursor afb s = (\b -> s { TT.previousCursor = b }) <$> afb (TT.previousCursor s)++nextCursor :: forall cursorKey wrapped. Lens' (TT.WithCursor cursorKey wrapped) Integer+nextCursor afb s = (\b -> s { TT.nextCursor = b }) <$> afb (TT.nextCursor s)++contents :: forall cursorKey a b. Lens (TT.WithCursor cursorKey a) (TT.WithCursor cursorKey b) [a] [b]+contents afb s = (\b -> s { TT.contents = b }) <$> afb (TT.contents s)
Web/Twitter/Conduit/Monad.hs view
@@ -1,7 +1,4 @@-{-# LANGUAGE GADTs #-}-{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE CPP #-} module Web.Twitter.Conduit.Monad ( TW
Web/Twitter/Conduit/Parameters.hs view
@@ -2,7 +2,12 @@ {-# LANGUAGE TemplateHaskell #-} module Web.Twitter.Conduit.Parameters- ( Parameters (..)+ ( Parameters(..)+ , PV(..)+ , APIQuery+ , APIQueryItem+ , makeSimpleQuery+ , HasSinceIdParam (..) , HasCountParam (..) , HasMaxIdParam (..)@@ -29,87 +34,83 @@ , UserParam(..) , UserListParam(..) , ListParam(..)+ , MediaData(..) , mkUserParam , mkUserListParam , mkListParam ) where -import Prelude as P-import Web.Twitter.Conduit.Parameters.Internal+import qualified Data.Text as T+import Network.HTTP.Client (RequestBody) import Web.Twitter.Conduit.Parameters.TH+import Web.Twitter.Conduit.Request import Web.Twitter.Types-import Data.Time.Calendar (Day)-import Data.Text.Strict.Lens-import Data.Text (Text)-import Control.Lens -import qualified Network.HTTP.Types as HT-import qualified Data.ByteString.Char8 as S8- data UserParam = UserIdParam UserId | ScreenNameParam String deriving (Show, Eq) data UserListParam = UserIdListParam [UserId] | ScreenNameListParam [String] deriving (Show, Eq) data ListParam = ListIdParam Integer | ListNameParam String deriving (Show, Eq)+data MediaData = MediaFromFile FilePath+ | MediaRequestBody FilePath RequestBody -defineHasParamClass "count" ''Integer 'readShow-defineHasParamClass "since_id" ''Integer 'readShow-defineHasParamClass "max_id" ''Integer 'readShow-defineHasParamClass "page" ''Integer 'readShow-defineHasParamClass "cursor" ''Integer 'readShow-defineHasParamClass "trim_user" ''Bool 'booleanQuery-defineHasParamClass "exclude_replies" ''Bool 'booleanQuery-defineHasParamClass "contributor_details" ''Bool 'booleanQuery-defineHasParamClass "include_entities" ''Bool 'booleanQuery-defineHasParamClass "include_user_entities" ''Bool 'booleanQuery-defineHasParamClass "include_rts" ''Bool 'booleanQuery-defineHasParamClass "include_my_retweet" ''Bool 'booleanQuery-defineHasParamClass "in_reply_to_status_id" ''StatusId 'readShow-defineHasParamClass "display_coordinates" ''Bool 'booleanQuery-defineHasParamClass "possibly_sensitive" ''Bool 'booleanQuery-defineHasParamClass "lang" ''Text 'utf8-defineHasParamClass "locale" ''Text 'utf8-defineHasParamClass "until" ''Day 'readShow-defineHasParamClass "skip_status" ''Bool 'booleanQuery-defineHasParamClass "follow" ''Bool 'booleanQuery-defineHasParamClass "map" ''Bool 'booleanQuery-defineHasParamClass' "media_ids" [t|[Integer]|] 'integerArrayQuery+defineHasParamClassInteger "count"+defineHasParamClassInteger "since_id"+defineHasParamClassInteger "max_id"+defineHasParamClassInteger "page"+defineHasParamClassInteger "cursor"+defineHasParamClassBool "trim_user"+defineHasParamClassBool "exclude_replies"+defineHasParamClassBool "contributor_details"+defineHasParamClassBool "include_entities"+defineHasParamClassBool "include_user_entities"+defineHasParamClassBool "include_rts"+defineHasParamClassBool "include_my_retweet"+defineHasParamClassInteger "in_reply_to_status_id"+defineHasParamClassBool "display_coordinates"+defineHasParamClassBool "possibly_sensitive"+defineHasParamClassString "lang"+defineHasParamClassString "locale"+defineHasParamClassDay "until"+defineHasParamClassBool "skip_status"+defineHasParamClassBool "follow"+defineHasParamClassBool "map"+defineHasParamClassIntegerArray "media_ids" -- | converts 'UserParam' to 'HT.SimpleQuery'. ----- >>> mkUserParam $ UserIdParam 123456+-- >>> makeSimpleQuery . mkUserParam $ UserIdParam 123456 -- [("user_id","123456")]--- >>> mkUserParam $ ScreenNameParam "thimura"+-- >>> makeSimpleQuery . mkUserParam $ ScreenNameParam "thimura" -- [("screen_name","thimura")]-mkUserParam :: UserParam -> HT.SimpleQuery-mkUserParam (UserIdParam uid) = [("user_id", readShow # uid)]-mkUserParam (ScreenNameParam sn) = [("screen_name", S8.pack sn)]+mkUserParam :: UserParam -> APIQuery+mkUserParam (UserIdParam uid) = [("user_id", PVInteger uid)]+mkUserParam (ScreenNameParam sn) = [("screen_name", PVString . T.pack $ sn)] -- | converts 'UserListParam' to 'HT.SimpleQuery'. ----- >>> mkUserListParam $ UserIdListParam [123456]+-- >>> makeSimpleQuery . mkUserListParam $ UserIdListParam [123456] -- [("user_id","123456")]--- >>> mkUserListParam $ UserIdListParam [123456, 654321]+-- >>> makeSimpleQuery . mkUserListParam $ UserIdListParam [123456, 654321] -- [("user_id","123456,654321")]--- >>> mkUserListParam $ ScreenNameListParam ["thimura", "NikaidouShinku"]+-- >>> makeSimpleQuery . mkUserListParam $ ScreenNameListParam ["thimura", "NikaidouShinku"] -- [("screen_name","thimura,NikaidouShinku")]-mkUserListParam :: UserListParam -> HT.SimpleQuery-mkUserListParam (UserIdListParam uids) = [("user_id", uids ^.. traversed . re readShow & S8.intercalate ",")]-mkUserListParam (ScreenNameListParam sns) = [("screen_name", S8.intercalate "," . P.map S8.pack $ sns)]+mkUserListParam :: UserListParam -> APIQuery+mkUserListParam (UserIdListParam uids) = [("user_id", PVIntegerArray uids)]+mkUserListParam (ScreenNameListParam sns) = [("screen_name", PVStringArray (Prelude.map T.pack sns))] -- | converts 'ListParam' to 'HT.SimpleQuery'. ----- >>> mkListParam $ ListIdParam 123123+-- >>> makeSimpleQuery . mkListParam $ ListIdParam 123123 -- [("list_id","123123")]--- >>> mkListParam $ ListNameParam "thimura/haskell"+-- >>> makeSimpleQuery . mkListParam $ ListNameParam "thimura/haskell" -- [("slug","haskell"),("owner_screen_name","thimura")]-mkListParam :: ListParam -> HT.SimpleQuery-mkListParam (ListIdParam lid) = [("list_id", readShow # lid)]+mkListParam :: ListParam -> APIQuery+mkListParam (ListIdParam lid) = [("list_id", PVInteger lid)] mkListParam (ListNameParam listname) =- [("slug", S8.pack lstName),- ("owner_screen_name", S8.pack screenName)]+ [("slug", PVString (T.pack lstName)),+ ("owner_screen_name", PVString (T.pack screenName))] where (screenName, ln) = span (/= '/') listname lstName = drop 1 ln-
− Web/Twitter/Conduit/Parameters/Internal.hs
@@ -1,94 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE Rank2Types #-}--module Web.Twitter.Conduit.Parameters.Internal- ( Parameters(..)- , readShow- , booleanQuery- , integerArrayQuery- , wrappedParam- ) where--import qualified Network.HTTP.Types as HT-import qualified Data.ByteString as S-import qualified Data.ByteString.Char8 as S8-import Data.Maybe-import Control.Lens--class Parameters a where- params :: Lens' a HT.SimpleQuery---- | This 'Prism' convert from a 'ByteString' to some value based on 'Read' and 'Show'------ >>> readShow # 2--- "2"--- >>> "1024" ^? readShow :: Maybe Integer--- Just 1024-readShow :: (Read a, Show a) => Prism' S.ByteString a-readShow = prism' (S8.pack . show) (readMaybe . S8.unpack)- where- readMaybe str = case [x | (x, t) <- reads str, ("", "") <- lex t] of- [x] -> Just x- _ -> Nothing---- | This 'Prism' convert from a 'ByteString' to 'Bool' value.------ >>> booleanQuery # True--- "true"--- >>> booleanQuery # False--- "false"--- >>> "true" ^? booleanQuery--- Just True--- >>> "1" ^? booleanQuery--- Just True--- >>> "t" ^? booleanQuery--- Just True--- >>> "test" ^? booleanQuery--- Just False-booleanQuery :: Prism' S.ByteString Bool-booleanQuery = prism' bs sb- where- bs True = "true"- bs False = "false"- sb "true" = Just True- sb "1" = Just True- sb "t" = Just True- sb _ = Just False---- | This 'Prism' convert from a 'ByteString' to the array of 'Integer' value.------ This is not a valid Prism, for example:------ @--- "1, 2" ^? integerArrayQuery == Just [1,2]--- integerArrayQuery # [1,2] != "1, 2"--- @------ >>> integerArrayQuery # [1]--- "1"--- >>> integerArrayQuery # [1,2234,3]--- "1,2234,3"--- >>> "1,2234,3" ^? integerArrayQuery--- Just [1,2234,3]--- >>> "" ^? integerArrayQuery--- Just []--- >>> "hoge,2" ^? integerArrayQuery--- Nothing-integerArrayQuery :: Prism' S.ByteString [Integer]-integerArrayQuery = prism' bs_arr arr_bs- where- bs_arr xs = S8.intercalate "," $ xs ^.. traversed . re readShow- arr_bs str = chkValid $ map (^? readShow) $ S8.split ',' str- chkValid arr =- if all isJust arr- then Just (catMaybes arr)- else Nothing--wrappedParam :: Parameters p => S.ByteString -> Prism' S.ByteString a -> Lens' p (Maybe a)-wrappedParam key aSBS = lens getter setter- where- getter = preview $ params . to (lookup key) . _Just . aSBS- setter = flip (over params . replace key)- replace k (Just v) = ((k, aSBS # v):) . dropAssoc k- replace k Nothing = dropAssoc k- dropAssoc k = filter ((/= k) . fst)
Web/Twitter/Conduit/Parameters/TH.hs view
@@ -4,10 +4,13 @@ module Web.Twitter.Conduit.Parameters.TH where -import Web.Twitter.Conduit.Parameters.Internal+import Web.Twitter.Conduit.Request import Language.Haskell.TH import Control.Lens+import qualified Data.ByteString as S import Data.Char+import Data.Text (Text)+import Data.Time.Calendar (Day) snakeToLowerCamel :: String -> String snakeToLowerCamel [] = []@@ -25,28 +28,38 @@ paramNameToClassName :: String -> String paramNameToClassName paramName = "Has" ++ snakeToUpperCamel paramName ++ "Param" -defineHasParamClass :: String -- ^ parameter name- -> Name -- ^ parameter type- -> Name -- ^ a Prism- -> Q [Dec]-defineHasParamClass paramName typeN =- defineHasParamClass' paramName (conT typeN)+wrappedParam :: Parameters p+ => S.ByteString+ -> (a -> PV)+ -> (PV -> a)+ -> Lens' p (Maybe a)+wrappedParam key wrap unwrap = lens getter setter+ where+ getter = preview $ params . to (lookup key) . _Just . to unwrap+ setter = flip (over params . replace key)+ replace k (Just v) = ((k, wrap v):) . dropAssoc k+ replace k Nothing = dropAssoc k+ dropAssoc k = filter ((/= k) . fst) -defineHasParamClass' :: String -> TypeQ -> Name -> Q [Dec]-defineHasParamClass' paramName typeQ =- defineHasParamClass'' cNameS fNameS paramName typeQ+defineHasParamClass :: Name -- wrap function+ -> Name -- unwrap function+ -> TypeQ -- wrapped type+ -> String -- ^ parameter name+ -> Q [Dec]+defineHasParamClass wrap unwrap typ paramName =+ defineHasParamClass' cNameS fNameS wrap unwrap typ paramName where cNameS = paramNameToClassName paramName fNameS = snakeToLowerCamel paramName -defineHasParamClass'' :: String -> String -> String -> TypeQ -> Name -> Q [Dec]-defineHasParamClass'' cNameS fNameS paramName typeQ prismN = do+defineHasParamClass' :: String -> String -> Name -> Name -> TypeQ -> String -> Q [Dec]+defineHasParamClass' cNameS fNameS wrap unwrap typ paramName = do a <- newName "a" cName <- newName cNameS fName <- newName fNameS let cCxt = cxt [classP ''Parameters [varT a]]- tySig = sigD fName (appT (appT (conT ''Lens') (varT a)) (appT (conT ''Maybe) typeQ))- valDef = valD (varP fName) (normalB (appE (appE (varE 'wrappedParam) (litE (stringL paramName))) (varE prismN))) []+ tySig = sigD fName (appT (appT (conT ''Lens') (varT a)) (appT (conT ''Maybe) typ))+ valDef = valD (varP fName) (normalB (appE (appE (appE (varE 'wrappedParam) (litE (stringL paramName))) (conE wrap)) (varE unwrap))) [] dec <- classD cCxt cName [PlainTV a] [] [tySig, valDef] return [dec] @@ -61,3 +74,27 @@ targetType = do a <- newName "a" appT (appT (conT (mkName "APIRequest")) (conT typName)) (varT a)++defineHasParamClassInteger :: String -> Q [Dec]+defineHasParamClassInteger =+ defineHasParamClass 'PVInteger 'unPVInteger [t|Integer|]++defineHasParamClassBool :: String -> Q [Dec]+defineHasParamClassBool =+ defineHasParamClass 'PVBool 'unPVBool [t|Bool|]++defineHasParamClassString :: String -> Q [Dec]+defineHasParamClassString =+ defineHasParamClass 'PVString 'unPVString [t|Text|]++defineHasParamClassIntegerArray :: String -> Q [Dec]+defineHasParamClassIntegerArray =+ defineHasParamClass 'PVIntegerArray 'unPVIntegerArray [t|[Integer]|]++defineHasParamClassStringArray :: String -> Q [Dec]+defineHasParamClassStringArray =+ defineHasParamClass 'PVStringArray 'unPVStringArray [t|[Text]|]++defineHasParamClassDay :: String -> Q [Dec]+defineHasParamClassDay =+ defineHasParamClass 'PVDay 'unPVDay [t|Day|]
Web/Twitter/Conduit/Request.hs view
@@ -1,18 +1,30 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE Rank2Types #-}-{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE CPP #-} module Web.Twitter.Conduit.Request- ( APIRequest(..)+ ( Parameters(..)+ , APIRequest(..)+ , APIQuery+ , APIQueryItem+ , PV(..)+ , makeSimpleQuery+ , paramValueBS ) where -import Web.Twitter.Conduit.Parameters-+import Control.Applicative+import Control.Lens+import Data.ByteString (ByteString)+import qualified Data.ByteString.Char8 as S8+import Data.Text (Text)+import qualified Data.Text.Encoding as T+import Data.Time.Calendar (Day) import Network.HTTP.Client.MultipartFormData import qualified Network.HTTP.Types as HT-import Control.Applicative +class Parameters a where+ params :: Lens' a APIQuery+ -- In GHC 7.4.2, the following test fails with Overlapping instances error. -- It may be caused by #5820 "defining instance in GHCi leads to duplicated instances". -- So, we bypass below tests when GHC version older than 7.6.@@ -22,6 +34,7 @@ -- >>> :set -XOverloadedStrings -XRank2Types -XEmptyDataDecls -XFlexibleInstances -XOverlappingInstances -XIncoherentInstances -- >>> import Control.Lens -- >>> import Data.Default+-- >>> import Web.Twitter.Conduit.Parameters -- >>> data SampleApi -- >>> type SampleId = Integer -- >>> instance HasCountParam (APIRequest SampleApi [SampleId])@@ -50,22 +63,22 @@ -- And update request parameters. -- -- >>> (sampleApiRequest & count ?~ 100 & maxId ?~ 1234567890) ^. params--- [("max_id","1234567890"),("count","100")]+-- [("max_id",PVInteger {unPVInteger = 1234567890}),("count",PVInteger {unPVInteger = 100})] -- >>> (sampleApiRequest & count ?~ 100 & maxId ?~ 1234567890 & count .~ Nothing) ^. params--- [("max_id","1234567890")]+-- [("max_id",PVInteger {unPVInteger = 1234567890})] #endif data APIRequest apiName responseType = APIRequestGet { _url :: String- , _params :: HT.SimpleQuery+ , _params :: APIQuery } | APIRequestPost { _url :: String- , _params :: HT.SimpleQuery+ , _params :: APIQuery } | APIRequestPostMultipart { _url :: String- , _params :: HT.SimpleQuery+ , _params :: APIQuery , _part :: [Part] } instance Parameters (APIRequest apiName responseType) where@@ -74,6 +87,30 @@ params f (APIRequestPostMultipart u pa prt) = (\p -> APIRequestPostMultipart u p prt) <$> f pa instance Show (APIRequest apiName responseType) where- show (APIRequestGet u p) = "APIRequestGet " ++ show u ++ " " ++ show p- show (APIRequestPost u p) = "APIRequestPost " ++ show u ++ " " ++ show p- show (APIRequestPostMultipart u p _) = "APIRequestPostMultipart " ++ show u ++ " " ++ show p+ show (APIRequestGet u p) = "APIRequestGet " ++ show u ++ " " ++ show (makeSimpleQuery p)+ show (APIRequestPost u p) = "APIRequestPost " ++ show u ++ " " ++ show (makeSimpleQuery p)+ show (APIRequestPostMultipart u p _) = "APIRequestPostMultipart " ++ show u ++ " " ++ show (makeSimpleQuery p)++type APIQuery = [APIQueryItem]+type APIQueryItem = (ByteString, PV)++data PV+ = PVInteger { unPVInteger :: Integer }+ | PVBool { unPVBool :: Bool }+ | PVString { unPVString :: Text }+ | PVIntegerArray { unPVIntegerArray :: [Integer] }+ | PVStringArray { unPVStringArray :: [Text] }+ | PVDay { unPVDay :: Day }+ deriving (Show, Eq)++makeSimpleQuery :: APIQuery -> HT.SimpleQuery+makeSimpleQuery = traversed . _2 %~ paramValueBS++paramValueBS :: PV -> ByteString+paramValueBS (PVInteger i) = S8.pack . show $ i+paramValueBS (PVBool True) = "true"+paramValueBS (PVBool False) = "false"+paramValueBS (PVString txt) = T.encodeUtf8 txt+paramValueBS (PVIntegerArray iarr) = S8.intercalate "," $ map (S8.pack . show) iarr+paramValueBS (PVStringArray iarr) = S8.intercalate "," $ map T.encodeUtf8 iarr+paramValueBS (PVDay day) = S8.pack . show $ day
+ Web/Twitter/Conduit/Response.hs view
@@ -0,0 +1,61 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveFoldable #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE OverloadedStrings #-}++module Web.Twitter.Conduit.Response+ ( Response (..)+ , TwitterError (..)+ , TwitterErrorMessage (..)+ ) where++import Control.Applicative+import Control.Exception+import Data.Aeson+import Data.Data+import Data.Foldable (Foldable)+import qualified Data.Text as T+import Data.Traversable (Traversable)+import Network.HTTP.Types (Status, ResponseHeaders, Status, ResponseHeaders)++data Response responseType = Response+ { responseStatus :: Status+ , responseHeaders :: ResponseHeaders+ , responseBody :: responseType+ } deriving (Show, Eq, Typeable, Functor, Foldable, Traversable)++data TwitterError+ = FromJSONError String+ | TwitterErrorResponse Status ResponseHeaders [TwitterErrorMessage]+ | TwitterStatusError Status ResponseHeaders Value+ deriving (Show, Typeable, Eq)++instance Exception TwitterError++-- | Twitter Error Messages+--+-- see detail: <https://dev.twitter.com/docs/error-codes-responses>+data TwitterErrorMessage = TwitterErrorMessage+ { twitterErrorCode :: Int+ , twitterErrorMessage :: T.Text+ } deriving (Show, Data, Typeable)++instance Eq TwitterErrorMessage where+ TwitterErrorMessage { twitterErrorCode = a } == TwitterErrorMessage { twitterErrorCode = b }+ = a == b++instance Ord TwitterErrorMessage where+ compare TwitterErrorMessage { twitterErrorCode = a } TwitterErrorMessage { twitterErrorCode = b }+ = a `compare` b++instance Enum TwitterErrorMessage where+ fromEnum = twitterErrorCode+ toEnum a = TwitterErrorMessage a T.empty++instance FromJSON TwitterErrorMessage where+ parseJSON (Object o) =+ TwitterErrorMessage+ <$> o .: "code"+ <*> o .: "message"+ parseJSON v = fail $ "unexpected: " ++ show v
Web/Twitter/Conduit/Status.hs view
@@ -1,13 +1,8 @@ {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE EmptyDataDecls #-}-#if __GLASGOW_HASKELL__ >= 704-{-# LANGUAGE ConstraintKinds #-}-#endif module Web.Twitter.Conduit.Status (@@ -43,14 +38,11 @@ import Prelude hiding ( lookup ) import Web.Twitter.Conduit.Base import Web.Twitter.Conduit.Request-import Web.Twitter.Conduit.Types import Web.Twitter.Conduit.Parameters import Web.Twitter.Conduit.Parameters.TH import Web.Twitter.Types -import qualified Data.ByteString as S import qualified Data.Text as T-import qualified Data.Text.Encoding as T import Network.HTTP.Client.MultipartFormData import Data.Default @@ -234,7 +226,7 @@ -- >>> update "Hello World" & inReplyToStatusId ?~ 1234567890 -- APIRequestPost "https://api.twitter.com/1.1/statuses/update.json" [("in_reply_to_status_id","1234567890"),("status","Hello World")] update :: T.Text -> APIRequest StatusesUpdate Status-update status = APIRequestPost uri [("status", T.encodeUtf8 status)]+update status = APIRequestPost uri [("status", PVString status)] where uri = endpoint ++ "statuses/update.json" deriveHasParamInstances ''StatusesUpdate [ "in_reply_to_status_id"@@ -278,7 +270,7 @@ -> MediaData -> APIRequest StatusesUpdateWithMedia Status updateWithMedia tweet mediaData =- APIRequestPostMultipart uri [("status", T.encodeUtf8 tweet)] [mediaBody mediaData]+ APIRequestPostMultipart uri [("status", PVString tweet)] [mediaBody mediaData] where uri = endpoint ++ "statuses/update_with_media.json" mediaBody (MediaFromFile fp) = partFileSource "media[]" fp@@ -306,8 +298,8 @@ -- APIRequestGet "https://api.twitter.com/1.1/statuses/lookup.json" [("id","10,432656548536401920")] -- >>> lookup [10, 432656548536401920] & includeEntities ?~ True -- APIRequestGet "https://api.twitter.com/1.1/statuses/lookup.json" [("include_entities","true"),("id","10,432656548536401920")]-lookup :: [ StatusId ] -> APIRequest StatusesLookup [Status]-lookup ids = APIRequestGet (endpoint ++ "statuses/lookup.json") [("id", S.intercalate "," . Prelude.map showBS $ ids)]+lookup :: [StatusId] -> APIRequest StatusesLookup [Status]+lookup ids = APIRequestGet (endpoint ++ "statuses/lookup.json") [("id", PVIntegerArray ids)] deriveHasParamInstances ''StatusesLookup [ "include_entities" , "trim_user"
Web/Twitter/Conduit/Stream.hs view
@@ -1,10 +1,7 @@ {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE CPP #-}-#if __GLASGOW_HASKELL__ >= 704 {-# LANGUAGE ConstraintKinds #-}-#endif module Web.Twitter.Conduit.Stream (@@ -23,18 +20,17 @@ , stream' ) where -import Web.Twitter.Conduit.Types import Web.Twitter.Conduit.Base import Web.Twitter.Conduit.Monad import Web.Twitter.Types+import Web.Twitter.Conduit.Parameters import Web.Twitter.Conduit.Request+import Web.Twitter.Conduit.Response import qualified Data.Conduit as C import qualified Data.Conduit.List as CL import qualified Data.Conduit.Internal as CI import qualified Data.Text as T-import qualified Data.Text.Encoding as T-import qualified Data.ByteString as S import Control.Monad.IO.Class import Data.Aeson @@ -72,9 +68,9 @@ data StatusesFilter statusesFilterByFollow :: [UserId] -> APIRequest StatusesFilter StreamingAPI statusesFilterByFollow userIds =- APIRequestPost statusesFilterEndpoint [("follow", S.intercalate "," . map showBS $ userIds)]+ APIRequestPost statusesFilterEndpoint [("follow", PVIntegerArray userIds)] statusesFilterByTrack :: T.Text -- ^ keyword -> APIRequest StatusesFilter StreamingAPI statusesFilterByTrack keyword =- APIRequestPost statusesFilterEndpoint [("track", T.encodeUtf8 keyword)]+ APIRequestPost statusesFilterEndpoint [("track", PVString keyword)]
− Web/Twitter/Conduit/Types.hs
@@ -1,154 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE DeriveFoldable #-}-{-# LANGUAGE DeriveFunctor #-}-{-# LANGUAGE DeriveTraversable #-}-{-# LANGUAGE EmptyDataDecls #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE CPP #-}--module Web.Twitter.Conduit.Types- ( Response (..)- , TwitterError (..)- , TwitterErrorMessage (..)- , CursorKey (..)- , IdsCursorKey- , UsersCursorKey- , WithCursor (..)- , MediaData (..)-#if !MIN_VERSION_twitter_types(0,5,0)- , UploadedMedia (..)- , ImageSizeType (..)-#endif- ) where---import Control.Applicative-import Control.Exception-import Data.Aeson-import Data.Data-import Data.Foldable (Foldable)-import Data.Monoid-import qualified Data.Text as T-import Data.Traversable (Traversable)-import Network.HTTP.Client (RequestBody)-import Network.HTTP.Types (Status, ResponseHeaders)-import Web.Twitter.Types (checkError)---- $setup--- >>> type UserId = Integer---class CursorKey a where- cursorKey :: a -> T.Text---- | Phantom type to specify the key which point out the content in the response.-data IdsCursorKey-instance CursorKey IdsCursorKey where- cursorKey = const "ids"---- | Phantom type to specify the key which point out the content in the response.-data UsersCursorKey-instance CursorKey UsersCursorKey where- cursorKey = const "users"--#if __GLASGOW_HASKELL__ >= 706--- | A wrapper for API responses which have "next_cursor" field.------ The first type parameter of 'WithCursor' specifies the field name of contents.------ >>> let Just res = decode "{\"previous_cursor\": 0, \"next_cursor\": 1234567890, \"ids\": [1111111111]}" :: Maybe (WithCursor IdsCursorKey UserId)--- >>> nextCursor res--- 1234567890--- >>> contents res--- [1111111111]------ >>> let Just res = decode "{\"previous_cursor\": 0, \"next_cursor\": 0, \"users\": [1000]}" :: Maybe (WithCursor UsersCursorKey UserId)--- >>> nextCursor res--- 0--- >>> contents res--- [1000]-#endif-data WithCursor cursorKey wrapped = WithCursor- { previousCursor :: Integer- , nextCursor :: Integer- , contents :: [wrapped]- } deriving Show--instance (FromJSON wrapped, CursorKey c) =>- FromJSON (WithCursor c wrapped) where- parseJSON (Object o) = checkError o >>- WithCursor <$> o .: "previous_cursor"- <*> o .: "next_cursor"- <*> o .: cursorKey (undefined :: c)- parseJSON _ = mempty--data MediaData = MediaFromFile FilePath- | MediaRequestBody FilePath RequestBody--#if !MIN_VERSION_twitter_types(0,5,0)-data ImageSizeType = ImageSizeType- { imageWidth :: Int- , imageHeight :: Int- , imageType :: T.Text- } deriving Show-instance FromJSON ImageSizeType where- parseJSON (Object o) =- ImageSizeType <$> o .: "w"- <*> o .: "h"- <*> o .: "image_type"- parseJSON v = fail $ "unknown value: " ++ show v--data UploadedMedia = UploadedMedia- { mediaId :: Integer- , mediaSize :: Integer- , mediaImage :: ImageSizeType- } deriving Show-instance FromJSON UploadedMedia where- parseJSON (Object o) =- UploadedMedia <$> o .: "media_id"- <*> o .: "size"- <*> o .: "image"- parseJSON v = fail $ "unknown value: " ++ show v-#endif--data Response responseType = Response- { responseStatus :: Status- , responseHeaders :: ResponseHeaders- , responseBody :: responseType- } deriving (Show, Eq, Typeable, Functor, Foldable, Traversable)--data TwitterError- = FromJSONError String- | TwitterErrorResponse Status ResponseHeaders [TwitterErrorMessage]- | TwitterStatusError Status ResponseHeaders Value- deriving (Show, Typeable, Eq)--instance Exception TwitterError---- | Twitter Error Messages------ see detail: <https://dev.twitter.com/docs/error-codes-responses>-data TwitterErrorMessage = TwitterErrorMessage- { twitterErrorCode :: Int- , twitterErrorMessage :: T.Text- } deriving (Show, Data, Typeable)--instance Eq TwitterErrorMessage where- TwitterErrorMessage { twitterErrorCode = a } == TwitterErrorMessage { twitterErrorCode = b }- = a == b--instance Ord TwitterErrorMessage where- compare TwitterErrorMessage { twitterErrorCode = a } TwitterErrorMessage { twitterErrorCode = b }- = a `compare` b--instance Enum TwitterErrorMessage where- fromEnum = twitterErrorCode- toEnum a = TwitterErrorMessage a T.empty--instance FromJSON TwitterErrorMessage where- parseJSON (Object o) =- TwitterErrorMessage- <$> o .: "code"- <*> o .: "message"- parseJSON v = fail $ "unexpected: " ++ show v
− Web/Twitter/Conduit/Types/Lens.hs
@@ -1,37 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE CPP #-}--module Web.Twitter.Conduit.Types.Lens- ( TT.Response- , responseStatus- , responseBody- , responseHeaders- , TT.WithCursor- , previousCursor- , nextCursor- , contents-#if !MIN_VERSION_twitter_types(0,5,0)- , TT.ImageSizeType- , imageWidth- , imageHeight- , imageType- , TT.UploadedMedia- , mediaId- , mediaSize- , mediaImage-#endif- , TT.TwitterErrorMessage- , twitterErrorMessage- , twitterErrorCode- ) where--import qualified Web.Twitter.Conduit.Types as TT-import Web.Twitter.Conduit.Types.TH--makeLenses ''TT.WithCursor-#if !MIN_VERSION_twitter_types(0,5,0)-makeLenses ''TT.ImageSizeType-makeLenses ''TT.UploadedMedia-#endif-makeLenses ''TT.Response-makeLenses ''TT.TwitterErrorMessage
− Web/Twitter/Conduit/Types/TH.hs
@@ -1,18 +0,0 @@-{-# LANGUAGE CPP #-}--module Web.Twitter.Conduit.Types.TH- ( makeLenses- ) where--import Control.Lens hiding (makeLenses)-import Language.Haskell.TH--#if MIN_VERSION_lens(4,4,0)-makeLenses :: Name -> Q [Dec]-makeLenses = makeLensesWith (lensRules & lensField .~ myFieldToDef)- where- myFieldToDef _ n = [TopName (mkName (nameBase n))]-#else-makeLenses :: Name -> Q [Dec]-makeLenses = makeLensesWith (defaultRules & lensField .~ Just)-#endif
sample/Common.hs view
sample/userstream.hs view
@@ -14,7 +14,7 @@ import System.Directory import Data.Conduit import qualified Data.Conduit.Binary as CB-import Network.HTTP.Conduit+import Network.HTTP.Conduit as HTTP import Web.Twitter.Conduit import Web.Twitter.Types.Lens@@ -79,5 +79,5 @@ unless exists $ withManager $ \mgr -> do req <- liftIO $ parseUrl url body <- http req mgr- responseBody body $$+- CB.sinkFile fname+ HTTP.responseBody body $$+- CB.sinkFile fname return fname
tests/ApiSpec.hs view
@@ -7,7 +7,7 @@ import qualified Data.Conduit.List as CL import Web.Twitter.Conduit (call, sourceWithCursor) import Web.Twitter.Conduit.Api-import Web.Twitter.Conduit.Types.Lens+import Web.Twitter.Conduit.Lens import qualified Web.Twitter.Conduit.Parameters as Param import Web.Twitter.Types.Lens import Control.Lens
twitter-conduit.cabal view
@@ -1,5 +1,5 @@ name: twitter-conduit-version: 0.0.5.8+version: 0.0.6 license: BSD3 license-file: LICENSE author: HATTORI Hiroki, Hideyuki Tanaka, Takahiro HIMURA@@ -58,7 +58,6 @@ base >= 4.5 && < 5 , transformers >= 0.2.2 , template-haskell- , lens >= 4.0 && < 4.5 , authenticate-oauth >= 1.3 , resourcet >= 1.0 , conduit >= 1.1@@ -74,28 +73,30 @@ , text >= 0.11 , containers , time- , twitter-types >= 0.2+ , twitter-types >= 0.5 if flag(lens-aeson)- build-depends: lens-aeson >= 1+ build-depends:+ lens-aeson >= 1+ , lens >= 4.4 && < 4.5+ else+ build-depends:+ lens >= 4.0 && < 4.4 exposed-modules: Web.Twitter.Conduit- Web.Twitter.Conduit.Types- Web.Twitter.Conduit.Types.Lens- Web.Twitter.Conduit.Types.TH- Web.Twitter.Conduit.Base+ Web.Twitter.Conduit.Lens Web.Twitter.Conduit.Api- Web.Twitter.Conduit.Monad Web.Twitter.Conduit.Stream Web.Twitter.Conduit.Status+ Web.Twitter.Conduit.Base+ Web.Twitter.Conduit.Monad Web.Twitter.Conduit.Request+ Web.Twitter.Conduit.Response+ Web.Twitter.Conduit.Cursor Web.Twitter.Conduit.Parameters- Web.Twitter.Conduit.Parameters.Internal Web.Twitter.Conduit.Parameters.TH - other-modules:- test-suite hlint type: exitcode-stdio-1.0 main-is: hlint.hs@@ -187,6 +188,7 @@ , http-conduit , monad-logger , authenticate-oauth+ , twitter-types , twitter-conduit , twitter-types