reckoner 0.2.0

A high level arbitrary precision arithmetic library supporting integer and rational numbers.
Documentation
use core::mem;
use reckoner::{Integer, Rational, RoundMode};

mod common;

fn main() {
    common::sequence_main_custom_display("sqrt_2_approximations", sqrt_2_approximations(), |rat| {
        rat.to_decimal(RoundMode::HalfUp, 100)
    });
}

struct PellLucasNumbersIter {
    g: fn(&Integer, &Integer) -> Integer,
    first: Integer,
    second: Integer,
}

impl Iterator for PellLucasNumbersIter {
    type Item = Integer;

    fn next(&mut self) -> Option<Self::Item> {
        let next_second = (self.g)(&self.first, &self.second);
        let next_first = mem::replace(&mut self.second, next_second);
        let next = mem::replace(&mut self.first, next_first);

        Some(next)
    }
}

fn generator(first: &Integer, second: &Integer) -> Integer {
    2 * second + first
}

fn pell_numbers_iter() -> impl Iterator<Item = Integer> {
    PellLucasNumbersIter {
        g: generator,
        first: 0.into(),
        second: 1.into(),
    }
}

fn pell_lucas_numbers_iter() -> impl Iterator<Item = Integer> {
    PellLucasNumbersIter {
        g: generator,
        first: 1.into(),
        second: 1.into(),
    }
}

fn sqrt_2_approximations() -> impl Iterator<Item = Rational> {
    pell_lucas_numbers_iter()
        .zip(pell_numbers_iter())
        .skip(1)
        .map(Rational::from)
}