^ base dirs to try
                     -> FilePath    -- ^ sub-path
                     -> IO (Maybe FilePath)
                      -- ^ get the first fullpath that exists
findFirstMatchedFile base_dir_list fp = do
  runMaybeT $ asum $ fmap (MaybeT . try_dir) $ base_dir_list
  where
    try_dir bp = do
     
runDelayedYamlLoaderExcL :: (MonadIO m) =>
    NonEmpty FilePath        -- ^ 消息文件存放目录
    -> DelayedYamlLoader a
    -> m a
runDelayedYamlLoaderExcL base_dir_list get_ext = liftIO $
    runReaderT get_ext base_dir_list
        >>= either (liftIO . throwIO) return
runDelayedYamlLoaderExcL base_dir_list get_ext = liftIO $
    runReaderT get_ext base_dir_list
        >>= either (liftIO . throwIO) return