Когда индустриальный программист пишет статью, он разбавляет её водой.
Когда участник русскоязычной Haskell-группы пишет статью, он разбавляет её кислотой.
Когда академик пишет статью, он разбавляет её кровью индустриального программиста.
(Посвящается Гранину)
Когда участник русскоязычной Haskell-группы пишет статью, он разбавляет её кислотой.
Когда академик пишет статью, он разбавляет её кровью индустриального программиста.
(Посвящается Гранину)
Forwarded from Oleg Andreev via @gif
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from 𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
#[cfg(test)]
mod tests {
use super::*;
use std::fs;
use tempdir::TempDir;
#[tokio::test]
async fn test_mailbox_senders() -> Result<(), Box<dyn std::error::Error>> {
let tmp_dir = TempDir::new("test_mailbox")?;
let address = tmp_dir.path().join("test_message_1");
let mut mailbox_sender = MailboxSenders::default();
let (tx, fut) = mailbox_sender.create(address.clone());
tx.unbounded_send("foo\n".into())?;
mailbox_sender
.get(&address)
.unwrap()
.unbounded_send("bar".into())?;
tx.unbounded_send("baz\n".into())?;
mailbox_sender.remove(&address);
drop(tx);
fut.await?;
let contents = fs::read_to_string(&address).unwrap();
assert_eq!(contents, "foo\nbar\nbaz\n");
Ok(())
}
}
Hippolot:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=3ebc57e006f8bd8a0e9611d2f7714f16
Как бы вы реализовали метод poll с такими же ограничениями как в сигнатуре? Футура должна суммировать значения трёх других футур
Denis:
а ты принципиально не используешь сторонние крейты?
Hippolot:
Те, что доступны на плейгранде, можно использовать. Я просто не совсем соображаю как с такими же ограничениями реализовать футуру. С async/.await было бы так:
async fn sum<Fut1, Fut2, Fut3>(fut1: Fut1, fut2: Fut2, fut3: Fut3) -> i32
where
Fut1: Future<Output = i32>,
Fut2: Future<Output = i32>,
Fut3: Future<Output = i32>,
{
fut1.await + fut2.await + fut3.await
}
Kitsu:
Ну во-первых зачем свою футурку писать, это ведь по сути join_all + sum. Ну а если очень хочется можно сделать Either<Fut, FutResult> для каждой футуры и последовательно поллить Either::Left. Как только все футуры будут готовы вернуть сумму из Either::Right. В идеале конечн это в какой-нибудь VecDeque положить, чтоб все это дело полилось раунд-робином.
red75prime:
C unsafe{ Pin::new_unchecked(ref_mut_fut1).poll(...) } мы никуда fut1 не двигаем, поэтому должно быть безопасно. Возможно. На 100% не поручусь.
Наверно ещё один unsafe понадобится, чтобы дропнуть содержимое fut1 in-place.
Denis:
ещё можно сделать futures unordered + fold :)
red75prime:
Да. Join из futures использует MaybeDone, а он делает Pin::new_unchecked(): https://github.com/rust-lang/futures-rs/blob/90c83b8faca107e6c4db63d10b0d4f2ea36d6628/futures-util/src/future/maybe_done.rs#L96
Drop in place реализуется через Pin::set()
https://t.iss.one/rustlang_ru/261371
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=3ebc57e006f8bd8a0e9611d2f7714f16
Как бы вы реализовали метод poll с такими же ограничениями как в сигнатуре? Футура должна суммировать значения трёх других футур
Denis:
а ты принципиально не используешь сторонние крейты?
Hippolot:
Те, что доступны на плейгранде, можно использовать. Я просто не совсем соображаю как с такими же ограничениями реализовать футуру. С async/.await было бы так:
async fn sum<Fut1, Fut2, Fut3>(fut1: Fut1, fut2: Fut2, fut3: Fut3) -> i32
where
Fut1: Future<Output = i32>,
Fut2: Future<Output = i32>,
Fut3: Future<Output = i32>,
{
fut1.await + fut2.await + fut3.await
}
Kitsu:
Ну во-первых зачем свою футурку писать, это ведь по сути join_all + sum. Ну а если очень хочется можно сделать Either<Fut, FutResult> для каждой футуры и последовательно поллить Either::Left. Как только все футуры будут готовы вернуть сумму из Either::Right. В идеале конечн это в какой-нибудь VecDeque положить, чтоб все это дело полилось раунд-робином.
red75prime:
C unsafe{ Pin::new_unchecked(ref_mut_fut1).poll(...) } мы никуда fut1 не двигаем, поэтому должно быть безопасно. Возможно. На 100% не поручусь.
Наверно ещё один unsafe понадобится, чтобы дропнуть содержимое fut1 in-place.
Denis:
ещё можно сделать futures unordered + fold :)
red75prime:
Да. Join из futures использует MaybeDone, а он делает Pin::new_unchecked(): https://github.com/rust-lang/futures-rs/blob/90c83b8faca107e6c4db63d10b0d4f2ea36d6628/futures-util/src/future/maybe_done.rs#L96
Drop in place реализуется через Pin::set()
https://t.iss.one/rustlang_ru/261371
GitHub
rust-lang/futures-rs
Zero-cost asynchronous programming in Rust. Contribute to rust-lang/futures-rs development by creating an account on GitHub.
Forwarded from Αλεχ Zhukovsky
Сравни один и тот же код:
Скала:
Скала:
def stateMonad[S]: Monad[State[S, ?]] = {
type StateS[A] = State[S, A]
new Monad[StateS] {
override def unit[A](a: => A): StateS[A] =
State(s => (a, s))
override def flatMap[A, B](f: StateS[A])(g: A => StateS[B]): StateS[B] =
State[S, B](
s1 => {
val (a, s2) = f.run(s1)
g(a).run(s2)
}
)
}
}
раст: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=47674d68fc881db41fa44153257b521fForwarded from саша кремов
Да нет, просто это разные области знаний, и если ты потратил годы на постижение ИП, это не значит что теперь ты с двух ног можешь залететь в ФП.
Forwarded from Andrew Demonov
Ты видосик посмотри. Он именно принцип объясняет. Без привязки к языку и так далее.
https://youtu.be/KAWeC9evbGM
https://youtu.be/KAWeC9evbGM
YouTube
Анатомия веб-сервиса / Андрей Смирнов (ex Skype)
Приглашаем на конференцию HighLoad++ 2025, которая пройдет 6 и 7 ноября в Москве!
Программа, подробности и билеты по ссылке: https://highload.ru/moscow/2025
________
HighLoad++ 2014
Презентация и тезисы:
https://www.highload.ru/2014/abstracts/1639.html…
Программа, подробности и билеты по ссылке: https://highload.ru/moscow/2025
________
HighLoad++ 2014
Презентация и тезисы:
https://www.highload.ru/2014/abstracts/1639.html…
Forwarded from Oleg Andreev
решил переписать толстый цикл task::spawn(async move {while let Some(event) = stream.next().await {...} }) на комбинацию стримов
Forwarded from A64m AL256m qn<cores> I0
что такое hkd - hkt или rank-n и как это можно не использовать в хачкеле?
https://twitter.com/ChShersh/status/1169167099601850368
https://twitter.com/ChShersh/status/1169167099601850368
Twitter
Dmitrii Kovanikov
#Haskell curiosity: decision to use simple data types (no GADTs, no HKD, no type-level magic) never failed so far. Sure, you write a bit of boilerplate here and there, but overall you have a pleasant experience. With complex types, something always gets in…
Forwarded from A64m AL256m qn<cores> I0
(нежелание связываться с гадт понятно)
Forwarded from Dmitrii
HKD расшифровывается как Higher-Kinded Data. Это паттерн программирования в haskell описанный вот в этом блог посте:
https://reasonablypolymorphic.com/blog/higher-kinded-data/
https://reasonablypolymorphic.com/blog/higher-kinded-data/