Hog
мап и тейквайл норм было б
Ayrat
не - там надо на выходе получить резалт
let maybeAsyncUploadedFiles: Async<ResizeArray<int64>> = AsyncSeq.ofSeq files |> AsyncSeq.mapAsync tryUploadFileAsync |> AsyncSeq.fold(fun maybeList file -> maybeList |> Result.bind (fun (list: ResizeArray<_>) -> match file with | Result.Ok (Some r) -> list.Add r ; Result.Ok list | Result.Ok None -> list.Add -1L; Result.Ok list | Result.Error e -> Result.Error list) ) (Result.Ok(ResizeArray())) |> Async.map (function Ok x | Error x -> x) EARLY return блять
Nikolay
:D
Ayrat
оно теперь собирает список до первой ошибки
Ayrat
и возвращает чо получилось
Ayrat
выглядит как говно, поэтому я виню дизайн @Dolfik
Hog
зачем фолд и мутабельное?
Nikolay
выглядит как говно, поэтому я виню дизайн @Dolfik
Ну вполне возможно дизайн говно :)
Ayrat
зачем фолд и мутабельное?
Почему нет? оно ж локально мутабельное
Hog
Почему нет? оно ж локально мутабельное
да там замапить в сек резалтов и тейквайл из саксесс
Hog
а потом замапить в то, что внеутри Ока
Ayrat
Кстати, да
Nikolay
Но я хз как ещё разрулить кейс, когда нужно сначала загрузить все файлы, а потом отправить запрос, при этом если файл не удалось загрузить - запрос не отправлять
Hog
Кстати, да
ленивость ж
Nikolay
Либо всё, либо ничего
Nikolay
Причём грузим последовательно
Hog
а если ошиблись в серединке - надо посылать какую "отмену"?
Vasily
Кстати
Vasily
Я вспомнил
Nikolay
Ничего посылать не надо)
Vasily
Можно ж unfold юзать
Vasily
Он прямо то, что надо
Hog
вернули юнит при ошибке
Hog
и последовательность стопнулась
Vasily
Анфолд фтв
Nikolay
вернули юнит при ошибке
Так надо Result вернуть, чтобы потом обработать эту ситуацию
Nikolay
какую?
Что не удалось загрузить файлы
Ayrat
Ок
Ayrat
let tryUploadFileAsync fileType = async { match fileType with | "image" -> return Some 1L | "uploading_not_required" -> return None | _ -> return failwithf "%s uploading is not supported" fileType } module Async = let map f x = async.Bind(x, f >> async.Return) let files = [] let maybeAsyncUploadedFiles = files |> Seq.map tryUploadFileAsync |> Async.Sequential |> Async.Catch |> Async.map (function | Choice1Of2 allIdList -> () | Choice2Of2 error -> () )
Ayrat
ИЗИ
Ayrat
заметьте как я ловко использовал исключение.
Ayrat
оно остановится на первой ошибке загрузке файла. Или все их загрузит.
Ayrat
и не выглядит как говно
Nikolay
Async.Sequential ток нет в стандартной либе
Ayrat
ОБНОВИСЬ
Nikolay
КУДА
TOV_MULTIMASSO
Что делает Async.Catch?
Vladislav
ОБНОВИСЬ
только после бумажки заверенной 10 архитекторами что оно не пизданется на ведре и иос
Vladislav
шучу
Vladislav
наверно можно
Hog
FSharp.Core 4.7
Vladislav
FSharp.Core 4.7
FSharp.Core o7
Vladislav
После этого
TOV_MULTIMASSO
Choice1Of2, матерь божья, это что, местный Either?
Ayrat
Async.Sequential ток нет в стандартной либе
вот тебе вариант через CE let uploadedFilesAsync = async { try let successIdList = ResizeArray<_>() for file in files do match! tryUploadFileAsync file with | Some id -> successIdList.Add id | None -> () return successIdList with e -> printfn "%s" (e.Message) return raise e }
TOV_MULTIMASSO
Вы делаете меня грустить
Vladislav
Скинуть немного кода FSharp.Plus чтобы разгрустить?
TOV_MULTIMASSO
Скинуть немного кода FSharp.Plus чтобы разгрустить?
А Async.Catch-то что делает? Давай, не откажусь
Ayrat
ЭКСЕПШОНЫ МЕДЛЕННО
сказал человек который ПОСЛЕДОВАТЕЛЬНО грузит 100500 файлов по сети
Vladislav
ЭКСЕПШОНЫ МЕДЛЕННО
как будто это единственное что там тормозит
Vladislav
Hog
ЭКСЕПШОНЫ МЕДЛЕННО
послушай - за тебя тут придумали решение
Hog
а ты ещё и выкобениваешься
Ayrat
один эксепшн НА ВЕСЬ воркфлоу явно не будет проблемой
TOV_MULTIMASSO
В смысле - эксепшены медленные?
Vladislav
А Async.Catch-то что делает? Давай, не откажусь
https://github.com/fsprojects/FSharpPlus/blob/master/src/FSharpPlus/Math/Applicative.fs
Ilya
один эксепшн НА ВЕСЬ воркфлоу явно не будет проблемой
А вдруг этот код на тысяче агентов будет выполняться???
Ayrat
В смысле - эксепшены медленные?
ну разматывать стек небыстро
Vladislav
А Async.Catch-то что делает? Давай, не откажусь
эксепшн ловит и заворачивает в Either
Ayrat
пользуйтесь эксепшнами.
Ilya
С длиннющим стеком в миллион вызовов.
Ayrat
локально
Ayrat
как я
Ayrat
тут в catch блоке надо чот умное написать, но это не ко мне
Ilya
А, там же локально.
TOV_MULTIMASSO
А, стек же
Диёр
юзайте result, err := doSomething()
Диёр
вы чо
TOV_MULTIMASSO
Где мои вилы?
Nikolay
Когда я был глупым джуном, я парсил так: int v = 0; try { v = int.Parse(str); } catch (Exception ex) { ... }