choosePoint :: ReaderT SearchResult IO ()
choosePoint = do
  SearchResult{..} <- ask

  liftIO $ T.putStr "\nChoose point: "
  point <- liftIO readLn

  let failCase = liftIO $ T.putStrLn "Point is out of bounds! Please try again!"
      safePrint xs i = maybe (failCase >> choosePoint)
                             (liftIO . print)
                             (xs `atMay` i)
      artistsCount = length artists
      startNumber  = artistsCount + 1

  if point > artistsCount
    then safePrint albums  (point - startNumber)
    else safePrint artists (point - 1)
choosePoint :: ReaderT SearchResult IO ()
choosePoint = do
  SearchResult{..} <- ask

  liftIO $ T.putStr "\nChoose point: "
  point <- liftIO readLn

  let failCase = liftIO $ T.putStrLn "Point is out of bounds! Please try again!"
      safePrint xs i = maybe (failCase >> choosePoint)
                             (liftIO . print)
                             (xs `atMay` i)
      artistsCount = length artists
      startNumber  = artistsCount + 1

  if point > artistsCount
    then safePrint albums  (point - startNumber)
    else safePrint artists (point - 1)
choosePoint = do
  SearchResult{..} <- ask

  liftIO $ T.putStr "\nChoose point: "
  point <- liftIO readLn

  let failCase = liftIO $ T.putStrLn "Point is out of bounds! Please try again!"
      safePrint xs i = maybe (failCase >> choosePoint)
                             (liftIO . print)
                             (xs `atMay` i)
      artistsCount = length artists
      startNumber  = artistsCount + 1

  if point > artistsCount
    then safePrint albums  (point - startNumber)
    else safePrint artists (point - 1)