#![warn(clippy::manual_find)]
#![allow(unused)]
#![allow(clippy::needless_return, clippy::uninlined_format_args)]

use std::collections::HashMap;

const ARRAY: &[u32; 5] = &[2, 7, 1, 9, 3];

fn lookup(n: u32) -> Option<u32> {
    ARRAY.iter().find(|&&v| v == n).copied()
}

fn with_pat(arr: Vec<(u32, u32)>) -> Option<u32> {
    arr.into_iter().map(|(a, _)| a).find(|&a| a.is_multiple_of(2))
}

struct Data {
    name: String,
    is_true: bool,
}
fn with_struct(arr: Vec<Data>) -> Option<Data> {
    arr.into_iter().find(|el| el.name.len() == 10)
}

struct Tuple(usize, usize);
fn with_tuple_struct(arr: Vec<Tuple>) -> Option<usize> {
    arr.into_iter().map(|Tuple(a, _)| a).find(|&a| a >= 3)
}

struct A;
impl A {
    fn should_keep(&self) -> bool {
        true
    }
}
fn with_method_call(arr: Vec<A>) -> Option<A> {
    arr.into_iter().find(|el| el.should_keep())
}

fn with_closure(arr: Vec<u32>) -> Option<u32> {
    let f = |el: u32| -> u32 { el + 10 };
    arr.into_iter().find(|&el| f(el) == 20)
}

fn with_closure2(arr: HashMap<String, i32>) -> Option<i32> {
    let f = |el: i32| -> bool { el == 10 };
    arr.values().find(|&&el| f(el)).copied()
}

fn with_bool(arr: Vec<Data>) -> Option<Data> {
    arr.into_iter().find(|el| el.is_true)
}

fn with_side_effects(arr: Vec<u32>) -> Option<u32> {
    for v in arr {
        if v == 1 {
            println!("side effect");
            return Some(v);
        }
    }
    None
}

fn with_else(arr: Vec<u32>) -> Option<u32> {
    for el in arr {
        if el.is_multiple_of(2) {
            return Some(el);
        } else {
            println!("{}", el);
        }
    }
    None
}

fn tuple_with_ref(v: [(u8, &u8); 3]) -> Option<u8> {
    v.into_iter().map(|(_, &x)| x).find(|&x| x > 10)
}

fn ref_to_tuple_with_ref(v: &[(u8, &u8)]) -> Option<u8> {
    v.iter().map(|&(_, &x)| x).find(|&x| x > 10)
}

fn explicit_ret(arr: Vec<i32>) -> Option<i32> {
    arr.into_iter().find(|&x| x >= 5)
}

fn plus_one(a: i32) -> Option<i32> {
    Some(a + 1)
}
fn fn_instead_of_some(a: &[i32]) -> Option<i32> {
    for &x in a {
        if x == 1 {
            return plus_one(x);
        }
    }
    None
}

fn for_in_condition(a: &[i32], b: bool) -> Option<i32> {
    if b {
        for &x in a {
            if x == 1 {
                return Some(x);
            }
        }
    }
    None
}

fn intermediate_statements(a: &[i32]) -> Option<i32> {
    for &x in a {
        if x == 1 {
            return Some(x);
        }
    }

    println!("side effect");

    None
}

fn mixed_binding_modes(arr: Vec<(i32, String)>) -> Option<i32> {
    for (x, mut s) in arr {
        if x == 1 && s.as_mut_str().len() == 2 {
            return Some(x);
        }
    }
    None
}

fn as_closure() {
    #[rustfmt::skip]
    let f = |arr: Vec<i32>| -> Option<i32> {
        arr.into_iter().find(|&x| x < 1)
    };
}

fn in_block(a: &[i32]) -> Option<i32> {
    let should_be_none = {
        for &x in a {
            if x == 1 {
                return Some(x);
            }
        }
        None
    };

    assert!(should_be_none.is_none());

    should_be_none
}

// Not handled yet
fn mut_binding(v: Vec<String>) -> Option<String> {
    for mut s in v {
        if s.as_mut_str().len() > 1 {
            return Some(s);
        }
    }
    None
}

fn subpattern(v: Vec<[u32; 32]>) -> Option<[u32; 32]> {
    for a @ [first, ..] in v {
        if a[12] == first {
            return Some(a);
        }
    }
    None
}

fn two_bindings(v: Vec<(u8, u8)>) -> Option<u8> {
    for (a, n) in v {
        if a == n {
            return Some(a);
        }
    }
    None
}

fn main() {}

mod issue14826 {
    fn adjust_fixable(needle: &str) -> Option<&'static str> {
        ["foo", "bar"].iter().find(|&candidate| candidate.eq_ignore_ascii_case(needle)).map(|v| v as _)
    }

    fn adjust_unfixable(needle: &str) -> Option<*const str> {
        ["foo", "bar"].iter().find(|&&candidate| candidate.eq_ignore_ascii_case(needle)).copied().map(|v| v as _)
    }
}
