export {
	/* Implementation of Rational Numbers
	 */

    let ratio-scale = λ{
        {p:ℕ; q:ℕ;} : ℚ ~ <Ratio ℕ~machine.UInt64> ;
        n : ℕ ~ machine.UInt64 ;
    } ↦ {
        i* q n;
        i* p n;
    };

    let ratio-normalize = λ{
        p: ℤ~machine.Int64;
        q: ℤ~machine.Int64;
    } : ℚ ~ <Ratio ℤ~machine.Int64>
    ↦ {
        let s = gcd p q;
        i/ q s;
        i/ p s;
    };

    let ratio-add = λ{
        {ap:ℕ; aq:ℕ;}: ℚ ~ <Ratio ℕ ~ ℤ_2^64 ~ machine.UInt64> ;
        {bp:ℕ; bq:ℕ;}: ℚ ~ <Ratio ℕ ~ ℤ_2^64 ~ machine.UInt64> ;
    } ↦ {
        let l = lcm aq bq;
        let as = i/ l aq;
        let bs = i/ l bq;

        i* aq as;
        i+ (i* ap as) (i* bp bs);
    };

    let ratio-mul = λ{
        {ap:ℤ; aq:ℤ;}: ℚ ~ <Ratio ℤ ~ ℤ_2^64 ~ machine.Int64> ;
        {bp:ℤ; bq:ℤ;}: ℚ ~ <Ratio ℤ ~ ℤ_2^64 ~ machine.Int64> ;                    
    } ↦ ratio-normalize (i* ap bp) (i* aq bq);


    let fmt-ratio = λ{ p:ℤ; q:ℤ; }: ℚ~<Ratio ℤ> ↦ {
        fmt-int q;':';fmt-int p;
    };
}