packages feed

telega-0.3.0: Network/API/Telegram/Bot/Core.hs

module Network.API.Telegram.Bot.Core (Telegram, telegram, environment, Token (..), Ok, result) where

import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
import "base" Control.Applicative ((<*>))
import "base" Control.Exception (SomeException)
import "base" Data.Bool (Bool (True, False))
import "base" Data.Eq (Eq)
import "base" Data.Either (Either)
import "base" Data.Function (flip, (.), ($))
import "base" Data.Functor ((<$>))
import "base" Data.Maybe (Maybe (Just, Nothing))
import "base" Data.Tuple (fst)
import "base" System.IO (IO)
import "joint" Control.Joint (Reader, run, lift, get, (:>))
import "text" Data.Text (Text)

newtype Token = Token Text deriving Eq

type Telegram e = Reader (e, Token) :> Either SomeException :> IO

telegram :: Token -> e -> Telegram e a -> IO (Either SomeException a)
telegram token env = run . flip run (env, token)

environment :: forall e . Telegram e e
environment = fst <$> lift @(Reader (e, Token)) get

data Ok a = Ok Bool a

result :: Ok a -> Maybe a
result (Ok True x) = Just x
result (Ok False _ ) = Nothing

instance FromJSON a => FromJSON (Ok a) where
	parseJSON = withObject "Ok" $ \v ->
		Ok <$> v .: "ok" <*> v .: "result"