{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE OverloadedStrings #-}
module Facebook.Monad
( FacebookT
, Auth
, NoAuth
, FbTier(..)
, runFacebookT
, runNoAuthFacebookT
, beta_runFacebookT
, beta_runNoAuthFacebookT
, getApiVersion
, getCreds
, getMCreds
, getManager
, getTier
, withTier
, addAppSecretProof
, makeAppSecretProof
, runResourceInFb
, mapFacebookT
, setApiVersion
, lift
) where
import Control.Applicative (Alternative, Applicative)
import Control.Monad (MonadPlus, liftM)
import Control.Monad.Base (MonadBase(..))
import Control.Monad.Fail (MonadFail(..))
import Control.Monad.Fix (MonadFix)
import Control.Monad.IO.Class (MonadIO)
import Control.Monad.Logger (MonadLogger(..))
import Control.Monad.Trans.Class (MonadTrans(lift))
import Control.Monad.Trans.Reader (ReaderT(..), ask, mapReaderT)
import qualified Control.Monad.Trans.Resource as R
import Crypto.Hash.Algorithms (SHA256)
import Crypto.MAC.HMAC (HMAC(..), hmac)
import Data.ByteArray.Encoding (Base(..), convertToBase)
import qualified Data.Text.Encoding as TE
import Data.Typeable (Typeable)
import Facebook.Types
import qualified Network.HTTP.Conduit as H
import qualified Network.HTTP.Types as HT
import UnliftIO
import qualified UnliftIO.Exception as E
newtype FacebookT auth m a = F
{ forall auth (m :: * -> *) a.
FacebookT auth m a -> ReaderT FbData m a
unF :: ReaderT FbData m a
} deriving ( (forall a b. (a -> b) -> FacebookT auth m a -> FacebookT auth m b)
-> (forall a b. a -> FacebookT auth m b -> FacebookT auth m a)
-> Functor (FacebookT auth m)
forall a b. a -> FacebookT auth m b -> FacebookT auth m a
forall a b. (a -> b) -> FacebookT auth m a -> FacebookT auth m b
forall auth (m :: * -> *) a b.
Functor m =>
a -> FacebookT auth m b -> FacebookT auth m a
forall auth (m :: * -> *) a b.
Functor m =>
(a -> b) -> FacebookT auth m a -> FacebookT auth m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall auth (m :: * -> *) a b.
Functor m =>
(a -> b) -> FacebookT auth m a -> FacebookT auth m b
fmap :: forall a b. (a -> b) -> FacebookT auth m a -> FacebookT auth m b
$c<$ :: forall auth (m :: * -> *) a b.
Functor m =>
a -> FacebookT auth m b -> FacebookT auth m a
<$ :: forall a b. a -> FacebookT auth m b -> FacebookT auth m a
Functor
, Functor (FacebookT auth m)
Functor (FacebookT auth m) =>
(forall a. a -> FacebookT auth m a)
-> (forall a b.
FacebookT auth m (a -> b)
-> FacebookT auth m a -> FacebookT auth m b)
-> (forall a b c.
(a -> b -> c)
-> FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m c)
-> (forall a b.
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m b)
-> (forall a b.
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m a)
-> Applicative (FacebookT auth m)
forall a. a -> FacebookT auth m a
forall a b.
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m a
forall a b.
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m b
forall a b.
FacebookT auth m (a -> b)
-> FacebookT auth m a -> FacebookT auth m b
forall a b c.
(a -> b -> c)
-> FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m c
forall auth (m :: * -> *).
Applicative m =>
Functor (FacebookT auth m)
forall auth (m :: * -> *) a.
Applicative m =>
a -> FacebookT auth m a
forall auth (m :: * -> *) a b.
Applicative m =>
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m a
forall auth (m :: * -> *) a b.
Applicative m =>
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m b
forall auth (m :: * -> *) a b.
Applicative m =>
FacebookT auth m (a -> b)
-> FacebookT auth m a -> FacebookT auth m b
forall auth (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c)
-> FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
$cpure :: forall auth (m :: * -> *) a.
Applicative m =>
a -> FacebookT auth m a
pure :: forall a. a -> FacebookT auth m a
$c<*> :: forall auth (m :: * -> *) a b.
Applicative m =>
FacebookT auth m (a -> b)
-> FacebookT auth m a -> FacebookT auth m b
<*> :: forall a b.
FacebookT auth m (a -> b)
-> FacebookT auth m a -> FacebookT auth m b
$cliftA2 :: forall auth (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c)
-> FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m c
liftA2 :: forall a b c.
(a -> b -> c)
-> FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m c
$c*> :: forall auth (m :: * -> *) a b.
Applicative m =>
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m b
*> :: forall a b.
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m b
$c<* :: forall auth (m :: * -> *) a b.
Applicative m =>
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m a
<* :: forall a b.
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m a
Applicative
, Applicative (FacebookT auth m)
Applicative (FacebookT auth m) =>
(forall a. FacebookT auth m a)
-> (forall a.
FacebookT auth m a -> FacebookT auth m a -> FacebookT auth m a)
-> (forall a. FacebookT auth m a -> FacebookT auth m [a])
-> (forall a. FacebookT auth m a -> FacebookT auth m [a])
-> Alternative (FacebookT auth m)
forall a. FacebookT auth m a
forall a. FacebookT auth m a -> FacebookT auth m [a]
forall a.
FacebookT auth m a -> FacebookT auth m a -> FacebookT auth m a
forall auth (m :: * -> *).
Alternative m =>
Applicative (FacebookT auth m)
forall auth (m :: * -> *) a. Alternative m => FacebookT auth m a
forall auth (m :: * -> *) a.
Alternative m =>
FacebookT auth m a -> FacebookT auth m [a]
forall auth (m :: * -> *) a.
Alternative m =>
FacebookT auth m a -> FacebookT auth m a -> FacebookT auth m a
forall (f :: * -> *).
Applicative f =>
(forall a. f a)
-> (forall a. f a -> f a -> f a)
-> (forall a. f a -> f [a])
-> (forall a. f a -> f [a])
-> Alternative f
$cempty :: forall auth (m :: * -> *) a. Alternative m => FacebookT auth m a
empty :: forall a. FacebookT auth m a
$c<|> :: forall auth (m :: * -> *) a.
Alternative m =>
FacebookT auth m a -> FacebookT auth m a -> FacebookT auth m a
<|> :: forall a.
FacebookT auth m a -> FacebookT auth m a -> FacebookT auth m a
$csome :: forall auth (m :: * -> *) a.
Alternative m =>
FacebookT auth m a -> FacebookT auth m [a]
some :: forall a. FacebookT auth m a -> FacebookT auth m [a]
$cmany :: forall auth (m :: * -> *) a.
Alternative m =>
FacebookT auth m a -> FacebookT auth m [a]
many :: forall a. FacebookT auth m a -> FacebookT auth m [a]
Alternative
, Applicative (FacebookT auth m)
Applicative (FacebookT auth m) =>
(forall a b.
FacebookT auth m a
-> (a -> FacebookT auth m b) -> FacebookT auth m b)
-> (forall a b.
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m b)
-> (forall a. a -> FacebookT auth m a)
-> Monad (FacebookT auth m)
forall a. a -> FacebookT auth m a
forall a b.
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m b
forall a b.
FacebookT auth m a
-> (a -> FacebookT auth m b) -> FacebookT auth m b
forall auth (m :: * -> *).
Monad m =>
Applicative (FacebookT auth m)
forall auth (m :: * -> *) a. Monad m => a -> FacebookT auth m a
forall auth (m :: * -> *) a b.
Monad m =>
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m b
forall auth (m :: * -> *) a b.
Monad m =>
FacebookT auth m a
-> (a -> FacebookT auth m b) -> FacebookT auth m b
forall (m :: * -> *).
Applicative m =>
(forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
$c>>= :: forall auth (m :: * -> *) a b.
Monad m =>
FacebookT auth m a
-> (a -> FacebookT auth m b) -> FacebookT auth m b
>>= :: forall a b.
FacebookT auth m a
-> (a -> FacebookT auth m b) -> FacebookT auth m b
$c>> :: forall auth (m :: * -> *) a b.
Monad m =>
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m b
>> :: forall a b.
FacebookT auth m a -> FacebookT auth m b -> FacebookT auth m b
$creturn :: forall auth (m :: * -> *) a. Monad m => a -> FacebookT auth m a
return :: forall a. a -> FacebookT auth m a
Monad
, Monad (FacebookT auth m)
Monad (FacebookT auth m) =>
(forall a. (a -> FacebookT auth m a) -> FacebookT auth m a)
-> MonadFix (FacebookT auth m)
forall a. (a -> FacebookT auth m a) -> FacebookT auth m a
forall auth (m :: * -> *). MonadFix m => Monad (FacebookT auth m)
forall auth (m :: * -> *) a.
MonadFix m =>
(a -> FacebookT auth m a) -> FacebookT auth m a
forall (m :: * -> *).
Monad m =>
(forall a. (a -> m a) -> m a) -> MonadFix m
$cmfix :: forall auth (m :: * -> *) a.
MonadFix m =>
(a -> FacebookT auth m a) -> FacebookT auth m a
mfix :: forall a. (a -> FacebookT auth m a) -> FacebookT auth m a
MonadFix
, Monad (FacebookT auth m)
Alternative (FacebookT auth m)
(Alternative (FacebookT auth m), Monad (FacebookT auth m)) =>
(forall a. FacebookT auth m a)
-> (forall a.
FacebookT auth m a -> FacebookT auth m a -> FacebookT auth m a)
-> MonadPlus (FacebookT auth m)
forall a. FacebookT auth m a
forall a.
FacebookT auth m a -> FacebookT auth m a -> FacebookT auth m a
forall auth (m :: * -> *). MonadPlus m => Monad (FacebookT auth m)
forall auth (m :: * -> *).
MonadPlus m =>
Alternative (FacebookT auth m)
forall auth (m :: * -> *) a. MonadPlus m => FacebookT auth m a
forall auth (m :: * -> *) a.
MonadPlus m =>
FacebookT auth m a -> FacebookT auth m a -> FacebookT auth m a
forall (m :: * -> *).
(Alternative m, Monad m) =>
(forall a. m a) -> (forall a. m a -> m a -> m a) -> MonadPlus m
$cmzero :: forall auth (m :: * -> *) a. MonadPlus m => FacebookT auth m a
mzero :: forall a. FacebookT auth m a
$cmplus :: forall auth (m :: * -> *) a.
MonadPlus m =>
FacebookT auth m a -> FacebookT auth m a -> FacebookT auth m a
mplus :: forall a.
FacebookT auth m a -> FacebookT auth m a -> FacebookT auth m a
MonadPlus
, Monad (FacebookT auth m)
Monad (FacebookT auth m) =>
(forall a. IO a -> FacebookT auth m a)
-> MonadIO (FacebookT auth m)
forall a. IO a -> FacebookT auth m a
forall auth (m :: * -> *). MonadIO m => Monad (FacebookT auth m)
forall auth (m :: * -> *) a.
MonadIO m =>
IO a -> FacebookT auth m a
forall (m :: * -> *).
Monad m =>
(forall a. IO a -> m a) -> MonadIO m
$cliftIO :: forall auth (m :: * -> *) a.
MonadIO m =>
IO a -> FacebookT auth m a
liftIO :: forall a. IO a -> FacebookT auth m a
MonadIO
, (forall (m :: * -> *). Monad m => Monad (FacebookT auth m)) =>
(forall (m :: * -> *) a. Monad m => m a -> FacebookT auth m a)
-> MonadTrans (FacebookT auth)
forall auth (m :: * -> *). Monad m => Monad (FacebookT auth m)
forall auth (m :: * -> *) a. Monad m => m a -> FacebookT auth m a
forall (m :: * -> *). Monad m => Monad (FacebookT auth m)
forall (m :: * -> *) a. Monad m => m a -> FacebookT auth m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *). Monad m => Monad (t m)) =>
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
$clift :: forall auth (m :: * -> *) a. Monad m => m a -> FacebookT auth m a
lift :: forall (m :: * -> *) a. Monad m => m a -> FacebookT auth m a
MonadTrans
, Monad (FacebookT auth m)
Monad (FacebookT auth m) =>
(forall e a.
(HasCallStack, Exception e) =>
e -> FacebookT auth m a)
-> MonadThrow (FacebookT auth m)
forall e a. (HasCallStack, Exception e) => e -> FacebookT auth m a
forall auth (m :: * -> *). MonadThrow m => Monad (FacebookT auth m)
forall auth (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> FacebookT auth m a
forall (m :: * -> *).
Monad m =>
(forall e a. (HasCallStack, Exception e) => e -> m a)
-> MonadThrow m
$cthrowM :: forall auth (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> FacebookT auth m a
throwM :: forall e a. (HasCallStack, Exception e) => e -> FacebookT auth m a
R.MonadThrow
, Monad (FacebookT auth m)
Monad (FacebookT auth m) =>
(forall a. String -> FacebookT auth m a)
-> MonadFail (FacebookT auth m)
forall a. String -> FacebookT auth m a
forall auth (m :: * -> *). MonadFail m => Monad (FacebookT auth m)
forall auth (m :: * -> *) a.
MonadFail m =>
String -> FacebookT auth m a
forall (m :: * -> *).
Monad m =>
(forall a. String -> m a) -> MonadFail m
$cfail :: forall auth (m :: * -> *) a.
MonadFail m =>
String -> FacebookT auth m a
fail :: forall a. String -> FacebookT auth m a
MonadFail
)
instance (MonadUnliftIO m) => MonadUnliftIO (FacebookT auth m) where
withRunInIO :: forall b.
((forall a. FacebookT auth m a -> IO a) -> IO b)
-> FacebookT auth m b
withRunInIO (forall a. FacebookT auth m a -> IO a) -> IO b
inner =
ReaderT FbData m b -> FacebookT auth m b
forall auth (m :: * -> *) a.
ReaderT FbData m a -> FacebookT auth m a
F (ReaderT FbData m b -> FacebookT auth m b)
-> ReaderT FbData m b -> FacebookT auth m b
forall a b. (a -> b) -> a -> b
$
(FbData -> m b) -> ReaderT FbData m b
forall r (m :: * -> *) a. (r -> m a) -> ReaderT r m a
ReaderT ((FbData -> m b) -> ReaderT FbData m b)
-> (FbData -> m b) -> ReaderT FbData m b
forall a b. (a -> b) -> a -> b
$ \FbData
r ->
((forall a. m a -> IO a) -> IO b) -> m b
forall b. ((forall a. m a -> IO a) -> IO b) -> m b
forall (m :: * -> *) b.
MonadUnliftIO m =>
((forall a. m a -> IO a) -> IO b) -> m b
withRunInIO (((forall a. m a -> IO a) -> IO b) -> m b)
-> ((forall a. m a -> IO a) -> IO b) -> m b
forall a b. (a -> b) -> a -> b
$ \forall a. m a -> IO a
run -> (forall a. FacebookT auth m a -> IO a) -> IO b
inner (\FacebookT auth m a
fbT -> m a -> IO a
forall a. m a -> IO a
run (m a -> IO a) -> m a -> IO a
forall a b. (a -> b) -> a -> b
$ ((ReaderT FbData m a -> FbData -> m a)
-> FbData -> ReaderT FbData m a -> m a
forall a b c. (a -> b -> c) -> b -> a -> c
flip ReaderT FbData m a -> FbData -> m a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT) FbData
r (FacebookT auth m a -> ReaderT FbData m a
forall auth (m :: * -> *) a.
FacebookT auth m a -> ReaderT FbData m a
unF FacebookT auth m a
fbT))
deriving instance
(R.MonadResource m, MonadBase IO m) =>
R.MonadResource (FacebookT auth m)
instance MonadBase b m => MonadBase b (FacebookT auth m) where
liftBase :: forall α. b α -> FacebookT auth m α
liftBase = m α -> FacebookT auth m α
forall (m :: * -> *) a. Monad m => m a -> FacebookT auth m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m α -> FacebookT auth m α)
-> (b α -> m α) -> b α -> FacebookT auth m α
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b α -> m α
forall α. b α -> m α
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase
instance MonadLogger m => MonadLogger (FacebookT auth m) where
monadLoggerLog :: forall msg.
ToLogStr msg =>
Loc -> ApiVersion -> LogLevel -> msg -> FacebookT auth m ()
monadLoggerLog Loc
loc ApiVersion
src LogLevel
lvl msg
msg = m () -> FacebookT auth m ()
forall (m :: * -> *) a. Monad m => m a -> FacebookT auth m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Loc -> ApiVersion -> LogLevel -> msg -> m ()
forall msg.
ToLogStr msg =>
Loc -> ApiVersion -> LogLevel -> msg -> m ()
forall (m :: * -> *) msg.
(MonadLogger m, ToLogStr msg) =>
Loc -> ApiVersion -> LogLevel -> msg -> m ()
monadLoggerLog Loc
loc ApiVersion
src LogLevel
lvl msg
msg)
data Auth
deriving (Typeable)
data NoAuth
deriving (Typeable)
data FbData = FbData
{ FbData -> Maybe Credentials
fbdCreds :: Maybe Credentials
, FbData -> Manager
fbdManager :: !H.Manager
, FbData -> FbTier
fbdTier :: !FbTier
, FbData -> IORef ApiVersion
fbdApiVersion :: IORef ApiVersion
} deriving (Typeable)
data FbTier
= Production
| Beta
deriving (FbTier -> FbTier -> Bool
(FbTier -> FbTier -> Bool)
-> (FbTier -> FbTier -> Bool) -> Eq FbTier
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FbTier -> FbTier -> Bool
== :: FbTier -> FbTier -> Bool
$c/= :: FbTier -> FbTier -> Bool
/= :: FbTier -> FbTier -> Bool
Eq, Eq FbTier
Eq FbTier =>
(FbTier -> FbTier -> Ordering)
-> (FbTier -> FbTier -> Bool)
-> (FbTier -> FbTier -> Bool)
-> (FbTier -> FbTier -> Bool)
-> (FbTier -> FbTier -> Bool)
-> (FbTier -> FbTier -> FbTier)
-> (FbTier -> FbTier -> FbTier)
-> Ord FbTier
FbTier -> FbTier -> Bool
FbTier -> FbTier -> Ordering
FbTier -> FbTier -> FbTier
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: FbTier -> FbTier -> Ordering
compare :: FbTier -> FbTier -> Ordering
$c< :: FbTier -> FbTier -> Bool
< :: FbTier -> FbTier -> Bool
$c<= :: FbTier -> FbTier -> Bool
<= :: FbTier -> FbTier -> Bool
$c> :: FbTier -> FbTier -> Bool
> :: FbTier -> FbTier -> Bool
$c>= :: FbTier -> FbTier -> Bool
>= :: FbTier -> FbTier -> Bool
$cmax :: FbTier -> FbTier -> FbTier
max :: FbTier -> FbTier -> FbTier
$cmin :: FbTier -> FbTier -> FbTier
min :: FbTier -> FbTier -> FbTier
Ord, Int -> FbTier -> ShowS
[FbTier] -> ShowS
FbTier -> String
(Int -> FbTier -> ShowS)
-> (FbTier -> String) -> ([FbTier] -> ShowS) -> Show FbTier
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FbTier -> ShowS
showsPrec :: Int -> FbTier -> ShowS
$cshow :: FbTier -> String
show :: FbTier -> String
$cshowList :: [FbTier] -> ShowS
showList :: [FbTier] -> ShowS
Show, ReadPrec [FbTier]
ReadPrec FbTier
Int -> ReadS FbTier
ReadS [FbTier]
(Int -> ReadS FbTier)
-> ReadS [FbTier]
-> ReadPrec FbTier
-> ReadPrec [FbTier]
-> Read FbTier
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS FbTier
readsPrec :: Int -> ReadS FbTier
$creadList :: ReadS [FbTier]
readList :: ReadS [FbTier]
$creadPrec :: ReadPrec FbTier
readPrec :: ReadPrec FbTier
$creadListPrec :: ReadPrec [FbTier]
readListPrec :: ReadPrec [FbTier]
Read, Int -> FbTier
FbTier -> Int
FbTier -> [FbTier]
FbTier -> FbTier
FbTier -> FbTier -> [FbTier]
FbTier -> FbTier -> FbTier -> [FbTier]
(FbTier -> FbTier)
-> (FbTier -> FbTier)
-> (Int -> FbTier)
-> (FbTier -> Int)
-> (FbTier -> [FbTier])
-> (FbTier -> FbTier -> [FbTier])
-> (FbTier -> FbTier -> [FbTier])
-> (FbTier -> FbTier -> FbTier -> [FbTier])
-> Enum FbTier
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: FbTier -> FbTier
succ :: FbTier -> FbTier
$cpred :: FbTier -> FbTier
pred :: FbTier -> FbTier
$ctoEnum :: Int -> FbTier
toEnum :: Int -> FbTier
$cfromEnum :: FbTier -> Int
fromEnum :: FbTier -> Int
$cenumFrom :: FbTier -> [FbTier]
enumFrom :: FbTier -> [FbTier]
$cenumFromThen :: FbTier -> FbTier -> [FbTier]
enumFromThen :: FbTier -> FbTier -> [FbTier]
$cenumFromTo :: FbTier -> FbTier -> [FbTier]
enumFromTo :: FbTier -> FbTier -> [FbTier]
$cenumFromThenTo :: FbTier -> FbTier -> FbTier -> [FbTier]
enumFromThenTo :: FbTier -> FbTier -> FbTier -> [FbTier]
Enum, Typeable)
defaultApiVersion :: ApiVersion
defaultApiVersion :: ApiVersion
defaultApiVersion = ApiVersion
"v3.2"
setApiVersion :: (MonadIO m) => ApiVersion -> FacebookT anyAuth m ()
setApiVersion :: forall (m :: * -> *) anyAuth.
MonadIO m =>
ApiVersion -> FacebookT anyAuth m ()
setApiVersion ApiVersion
apiVersion = do
IORef ApiVersion
ref <- FbData -> IORef ApiVersion
fbdApiVersion (FbData -> IORef ApiVersion)
-> FacebookT anyAuth m FbData
-> FacebookT anyAuth m (IORef ApiVersion)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
`liftM` ReaderT FbData m FbData -> FacebookT anyAuth m FbData
forall auth (m :: * -> *) a.
ReaderT FbData m a -> FacebookT auth m a
F ReaderT FbData m FbData
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
IORef ApiVersion
-> (ApiVersion -> (ApiVersion, ())) -> FacebookT anyAuth m ()
forall (m :: * -> *) a b.
MonadIO m =>
IORef a -> (a -> (a, b)) -> m b
atomicModifyIORef' IORef ApiVersion
ref (\ApiVersion
_ -> (ApiVersion
apiVersion, ()))
() -> FacebookT anyAuth m ()
forall a. a -> FacebookT anyAuth m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
runFacebookT ::
(MonadIO m)
=> Credentials
-> H.Manager
-> FacebookT Auth m a
-> m a
runFacebookT :: forall (m :: * -> *) a.
MonadIO m =>
Credentials -> Manager -> FacebookT Auth m a -> m a
runFacebookT Credentials
creds Manager
manager (F ReaderT FbData m a
act) = do
IORef ApiVersion
apiref <- ApiVersion -> m (IORef ApiVersion)
forall (m :: * -> *) a. MonadIO m => a -> m (IORef a)
newIORef ApiVersion
defaultApiVersion
ReaderT FbData m a -> FbData -> m a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT FbData m a
act (Maybe Credentials
-> Manager -> FbTier -> IORef ApiVersion -> FbData
FbData (Credentials -> Maybe Credentials
forall a. a -> Maybe a
Just Credentials
creds) Manager
manager FbTier
Production IORef ApiVersion
apiref)
addAppSecretProof ::
Credentials
-> Maybe (AccessToken anykind)
-> HT.SimpleQuery
-> HT.SimpleQuery
addAppSecretProof :: forall anykind.
Credentials
-> Maybe (AccessToken anykind) -> SimpleQuery -> SimpleQuery
addAppSecretProof (Credentials ApiVersion
_ ApiVersion
_ ApiVersion
_ Bool
False) Maybe (AccessToken anykind)
_ SimpleQuery
query = SimpleQuery
query
addAppSecretProof Credentials
creds Maybe (AccessToken anykind)
mtoken SimpleQuery
query = Credentials -> Maybe (AccessToken anykind) -> SimpleQuery
forall anyKind.
Credentials -> Maybe (AccessToken anyKind) -> SimpleQuery
makeAppSecretProof Credentials
creds Maybe (AccessToken anykind)
mtoken SimpleQuery -> SimpleQuery -> SimpleQuery
forall a. Semigroup a => a -> a -> a
<> SimpleQuery
query
makeAppSecretProof ::
Credentials
-> Maybe (AccessToken anyKind)
-> HT.SimpleQuery
makeAppSecretProof :: forall anyKind.
Credentials -> Maybe (AccessToken anyKind) -> SimpleQuery
makeAppSecretProof Credentials
creds (Just (UserAccessToken UserId
_ ApiVersion
accessToken UTCTime
_)) =
[(ApiVersion -> ByteString
TE.encodeUtf8 ApiVersion
"appsecret_proof", ByteString
proof)]
where
hmacData :: HMAC SHA256
hmacData :: HMAC SHA256
hmacData = ByteString -> ByteString -> HMAC SHA256
forall key message a.
(ByteArrayAccess key, ByteArrayAccess message, HashAlgorithm a) =>
key -> message -> HMAC a
hmac (Credentials -> ByteString
appSecretBS Credentials
creds) (ApiVersion -> ByteString
TE.encodeUtf8 ApiVersion
accessToken)
proof :: ByteString
proof = Base -> HMAC SHA256 -> ByteString
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
Base -> bin -> bout
convertToBase Base
Base16 HMAC SHA256
hmacData
makeAppSecretProof Credentials
_ Maybe (AccessToken anyKind)
_ = []
runNoAuthFacebookT ::
(MonadIO m)
=> H.Manager
-> FacebookT NoAuth m a
-> m a
runNoAuthFacebookT :: forall (m :: * -> *) a.
MonadIO m =>
Manager -> FacebookT NoAuth m a -> m a
runNoAuthFacebookT Manager
manager (F ReaderT FbData m a
act) = do
IORef ApiVersion
apiref <- ApiVersion -> m (IORef ApiVersion)
forall (m :: * -> *) a. MonadIO m => a -> m (IORef a)
newIORef ApiVersion
defaultApiVersion
ReaderT FbData m a -> FbData -> m a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT FbData m a
act (Maybe Credentials
-> Manager -> FbTier -> IORef ApiVersion -> FbData
FbData Maybe Credentials
forall a. Maybe a
Nothing Manager
manager FbTier
Production IORef ApiVersion
apiref)
beta_runFacebookT ::
(MonadIO m) => Credentials -> H.Manager -> FacebookT Auth m a -> m a
beta_runFacebookT :: forall (m :: * -> *) a.
MonadIO m =>
Credentials -> Manager -> FacebookT Auth m a -> m a
beta_runFacebookT Credentials
creds Manager
manager (F ReaderT FbData m a
act) = do
IORef ApiVersion
apiref <- ApiVersion -> m (IORef ApiVersion)
forall (m :: * -> *) a. MonadIO m => a -> m (IORef a)
newIORef ApiVersion
defaultApiVersion
ReaderT FbData m a -> FbData -> m a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT FbData m a
act (Maybe Credentials
-> Manager -> FbTier -> IORef ApiVersion -> FbData
FbData (Credentials -> Maybe Credentials
forall a. a -> Maybe a
Just Credentials
creds) Manager
manager FbTier
Beta IORef ApiVersion
apiref)
beta_runNoAuthFacebookT ::
(MonadIO m) => H.Manager -> FacebookT NoAuth m a -> m a
beta_runNoAuthFacebookT :: forall (m :: * -> *) a.
MonadIO m =>
Manager -> FacebookT NoAuth m a -> m a
beta_runNoAuthFacebookT Manager
manager (F ReaderT FbData m a
act) = do
IORef ApiVersion
apiref <- ApiVersion -> m (IORef ApiVersion)
forall (m :: * -> *) a. MonadIO m => a -> m (IORef a)
newIORef ApiVersion
defaultApiVersion
ReaderT FbData m a -> FbData -> m a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT FbData m a
act (Maybe Credentials
-> Manager -> FbTier -> IORef ApiVersion -> FbData
FbData Maybe Credentials
forall a. Maybe a
Nothing Manager
manager FbTier
Beta IORef ApiVersion
apiref)
getCreds :: (Monad m, MonadIO m) => FacebookT Auth m Credentials
getCreds :: forall (m :: * -> *).
(Monad m, MonadIO m) =>
FacebookT Auth m Credentials
getCreds = do
Maybe Credentials
mCreds <- FacebookT Auth m (Maybe Credentials)
forall (m :: * -> *) anyAuth.
Monad m =>
FacebookT anyAuth m (Maybe Credentials)
getMCreds
case Maybe Credentials
mCreds of
Maybe Credentials
Nothing -> FacebookException -> FacebookT Auth m Credentials
forall (m :: * -> *) e a. (MonadIO m, Exception e) => e -> m a
E.throwIO (FacebookException -> FacebookT Auth m Credentials)
-> FacebookException -> FacebookT Auth m Credentials
forall a b. (a -> b) -> a -> b
$ ApiVersion -> FacebookException
FbLibraryException ApiVersion
"Couldn't get credentials."
Just Credentials
creds -> Credentials -> FacebookT Auth m Credentials
forall a. a -> FacebookT Auth m a
forall (m :: * -> *) a. Monad m => a -> m a
return Credentials
creds
getMCreds :: Monad m => FacebookT anyAuth m (Maybe Credentials)
getMCreds :: forall (m :: * -> *) anyAuth.
Monad m =>
FacebookT anyAuth m (Maybe Credentials)
getMCreds = FbData -> Maybe Credentials
fbdCreds (FbData -> Maybe Credentials)
-> FacebookT anyAuth m FbData
-> FacebookT anyAuth m (Maybe Credentials)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
`liftM` ReaderT FbData m FbData -> FacebookT anyAuth m FbData
forall auth (m :: * -> *) a.
ReaderT FbData m a -> FacebookT auth m a
F ReaderT FbData m FbData
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
getApiVersion :: MonadIO m => FacebookT anyAuth m ApiVersion
getApiVersion :: forall (m :: * -> *) anyAuth.
MonadIO m =>
FacebookT anyAuth m ApiVersion
getApiVersion = do
IORef ApiVersion
ref <- FbData -> IORef ApiVersion
fbdApiVersion (FbData -> IORef ApiVersion)
-> FacebookT anyAuth m FbData
-> FacebookT anyAuth m (IORef ApiVersion)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
`liftM` ReaderT FbData m FbData -> FacebookT anyAuth m FbData
forall auth (m :: * -> *) a.
ReaderT FbData m a -> FacebookT auth m a
F ReaderT FbData m FbData
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
ApiVersion
apiVersion <- IORef ApiVersion -> FacebookT anyAuth m ApiVersion
forall (m :: * -> *) a. MonadIO m => IORef a -> m a
readIORef IORef ApiVersion
ref
ApiVersion -> FacebookT anyAuth m ApiVersion
forall a. a -> FacebookT anyAuth m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ApiVersion
apiVersion
getManager :: Monad m => FacebookT anyAuth m H.Manager
getManager :: forall (m :: * -> *) anyAuth.
Monad m =>
FacebookT anyAuth m Manager
getManager = FbData -> Manager
fbdManager (FbData -> Manager)
-> FacebookT anyAuth m FbData -> FacebookT anyAuth m Manager
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
`liftM` ReaderT FbData m FbData -> FacebookT anyAuth m FbData
forall auth (m :: * -> *) a.
ReaderT FbData m a -> FacebookT auth m a
F ReaderT FbData m FbData
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
getTier :: Monad m => FacebookT anyAuth m FbTier
getTier :: forall (m :: * -> *) anyAuth. Monad m => FacebookT anyAuth m FbTier
getTier = FbData -> FbTier
fbdTier (FbData -> FbTier)
-> FacebookT anyAuth m FbData -> FacebookT anyAuth m FbTier
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
`liftM` ReaderT FbData m FbData -> FacebookT anyAuth m FbData
forall auth (m :: * -> *) a.
ReaderT FbData m a -> FacebookT auth m a
F ReaderT FbData m FbData
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
withTier :: Monad m => (FbTier -> a) -> FacebookT anyAuth m a
withTier :: forall (m :: * -> *) a anyAuth.
Monad m =>
(FbTier -> a) -> FacebookT anyAuth m a
withTier = ((FbTier -> a)
-> FacebookT anyAuth m FbTier -> FacebookT anyAuth m a)
-> FacebookT anyAuth m FbTier
-> (FbTier -> a)
-> FacebookT anyAuth m a
forall a b c. (a -> b -> c) -> b -> a -> c
flip (FbTier -> a)
-> FacebookT anyAuth m FbTier -> FacebookT anyAuth m a
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM FacebookT anyAuth m FbTier
forall (m :: * -> *) anyAuth. Monad m => FacebookT anyAuth m FbTier
getTier
runResourceInFb ::
(R.MonadResource m, MonadUnliftIO m)
=> FacebookT anyAuth (R.ResourceT m) a
-> FacebookT anyAuth m a
runResourceInFb :: forall (m :: * -> *) anyAuth a.
(MonadResource m, MonadUnliftIO m) =>
FacebookT anyAuth (ResourceT m) a -> FacebookT anyAuth m a
runResourceInFb (F ReaderT FbData (ResourceT m) a
inner) = ReaderT FbData m a -> FacebookT anyAuth m a
forall auth (m :: * -> *) a.
ReaderT FbData m a -> FacebookT auth m a
F (ReaderT FbData m a -> FacebookT anyAuth m a)
-> ReaderT FbData m a -> FacebookT anyAuth m a
forall a b. (a -> b) -> a -> b
$ ReaderT FbData m FbData
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask ReaderT FbData m FbData
-> (FbData -> ReaderT FbData m a) -> ReaderT FbData m a
forall a b.
ReaderT FbData m a
-> (a -> ReaderT FbData m b) -> ReaderT FbData m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= m a -> ReaderT FbData m a
forall (m :: * -> *) a. Monad m => m a -> ReaderT FbData m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ReaderT FbData m a)
-> (FbData -> m a) -> FbData -> ReaderT FbData m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ResourceT m a -> m a
forall (m :: * -> *) a. MonadUnliftIO m => ResourceT m a -> m a
R.runResourceT (ResourceT m a -> m a)
-> (FbData -> ResourceT m a) -> FbData -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReaderT FbData (ResourceT m) a -> FbData -> ResourceT m a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT FbData (ResourceT m) a
inner
mapFacebookT :: (m a -> n b) -> FacebookT anyAuth m a -> FacebookT anyAuth n b
mapFacebookT :: forall (m :: * -> *) a (n :: * -> *) b anyAuth.
(m a -> n b) -> FacebookT anyAuth m a -> FacebookT anyAuth n b
mapFacebookT m a -> n b
f = ReaderT FbData n b -> FacebookT anyAuth n b
forall auth (m :: * -> *) a.
ReaderT FbData m a -> FacebookT auth m a
F (ReaderT FbData n b -> FacebookT anyAuth n b)
-> (FacebookT anyAuth m a -> ReaderT FbData n b)
-> FacebookT anyAuth m a
-> FacebookT anyAuth n b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (m a -> n b) -> ReaderT FbData m a -> ReaderT FbData n b
forall (m :: * -> *) a (n :: * -> *) b r.
(m a -> n b) -> ReaderT r m a -> ReaderT r n b
mapReaderT m a -> n b
f (ReaderT FbData m a -> ReaderT FbData n b)
-> (FacebookT anyAuth m a -> ReaderT FbData m a)
-> FacebookT anyAuth m a
-> ReaderT FbData n b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FacebookT anyAuth m a -> ReaderT FbData m a
forall auth (m :: * -> *) a.
FacebookT auth m a -> ReaderT FbData m a
unF