floop 0.3.2

A more convenient and less error prone replacement for loop `{ select! { .. }}`
Documentation
use std::{future::ready, time::Duration};

use floop::floop;
use smol::{Timer, block_on};

#[test]
fn continue_is_not_infinite_loop() {
    let mut ran = false;
    
    block_on(async {
        floop! {
            unbiased
            return
            _ in ready(()) => {
                assert!(!ran);

                ran = true;
                continue;
            }
            _ in ready(()) => {
                if ran {
                    return;
                }
            }
        }.0
    });
}

#[test]
fn continue_before_after() {
    let mut counter = 0;
    block_on(async {
        floop! {
            biased
            return
            before => {
                counter += 1;
                if counter == 1 {
                    continue
                }
            }
            after => {
                continue
            }
            _ in if counter == 3, ready(()) => {
                return;
            }
            _ in ready(()) => {}
        };
    })
}

#[test]
fn continue_does_not_poll_after_finish() {
    struct NoCopy;

    let mut counter = 0;

    block_on(async {
        floop! {
            biased
            _ in ready(NoCopy) => {
                counter += 1;
                if counter < 10 {
                    continue;
                }

                break;
            }
        }.await;
    })
}

#[test]
fn continue_before_afdter_no_arms() {
    let mut counter = 0;
    #[expect(unreachable_code, reason="i'm testing if it compiles.")]
    block_on(floop! {
        biased
        before => {
            counter += 1;
            if counter < 10 {
                continue;
            }
        }
        after => {
            continue
        }
    });

    assert_eq!(counter, 10);
}

#[test]
fn continue_does_not_prevent_break() {
    let mut arm_broke = false;
    let mut counter = 0;

    let fut = floop! {
        biased
        before => {
            counter += 1;
            assert!(counter <= 1);
            
            if arm_broke {
                continue;
            }
        }
        _ in ready(()) => break 5,
        after => if !arm_broke {
            arm_broke = true;
            continue;
        },
    };

    assert_eq!(block_on(fut), 5);
    assert_eq!(counter, 1);
}

#[test]
fn continue_move() {
    struct NoCopy;
    
    let fut = async {
        floop! {
            unbiased
            return
            value in ready(NoCopy) => {
                #[expect(clippy::drop_non_drop, reason="i'm testing if consuming `value` compiles")]
                drop(value);
                continue;
            }
            _ in Timer::after(Duration::from_millis(100)) => {
                return 10;
            }
        }.0
    };

    assert_eq!(block_on(fut), 10);
}