fallible-0.1.0: example/Main.hs
module Main where
import Data.Fallible
import qualified Data.List as L
main :: IO ()
main = test
where
test = run "Alice" "dummy" False
run :: String -> Token -> Bool -> IO ()
run targetName token verbose = evalContT $ do
users <- lift (getUsers token) !?= exit . logDebug'
targetId <- userId <$> L.find isTarget users ??? exit (logDebug' emsg)
channels <- lift (getChannels token) !?= exit . logDebug'
lift $ mapM_ (logDebug' . channelName) $
filter (elem targetId . channelMembers) channels
where
logDebug' = logDebug verbose
emsg = "user not found: " ++ targetName
isTarget user = userName user == targetName
logDebug :: Bool -> String -> IO ()
logDebug verbose msg = if verbose then putStrLn msg else pure ()
-- Dummy API
type UserId = String
data User = User
{ userId :: UserId
, userName :: String
, userEmail :: String
, userAdmin :: Bool
} deriving (Show, Eq)
data Channel = Channel
{ channelId :: String
, channelName :: String
, channelMembers :: [UserId]
, channelPrivate :: Bool
} deriving (Show, Eq)
type Error = String
type Token = String
getUsers :: Token -> IO (Either Error [User])
getUsers "" = pure (Left "invalid token")
getUsers _token = pure (Right _users)
_users :: [User]
_users =
[ User "u123456" "Alice" "alice@example.com" False
, User "u123457" "Bob" "bob@example.com" False
, User "u123458" "Curry" "curry@example.com" True
]
getChannels :: Token -> IO (Either Error [Channel])
getChannels "" = pure (Left "invalid token")
getChannels _token = pure (Right _channels)
_channels :: [Channel]
_channels =
[ Channel "c123456" "general" (map userId _users) False
, Channel "c123457" "random" (map userId _users) False
, Channel "c123458" "owners" (map userId $ filter userAdmin _users) True
, Channel "c123459" "secret" (map userId $ take 2 _users) True
]