{
: read
: show
: compare
: min
: max
: pow
: gcd
: abs
: fold
}

Where

Define (pow b n)
    Iterate {a b n} From {1 b n}
        Let a If [[n % 2] = 1] [a * b] a
        Let n [n / 2]
        In
        If [n = 0]
            a
            Continue {a [b * b] n}

Define (gcd b a)
    Iterate {b a}
        If [a = 0]
            (abs b)
            Continue {a [b % a]}

Define (fold n z succ)
    Iterate {i r} From {0 z}
        If [i = n]
            r
            Continue {[i + 1] (succ i r)}

Where

Define (read text)
    Let n (STRING.length text)
    In
    Iterate {i num} From {0 0}
        Cond
        | [i = n] 'just.num
        | True
            Let c (STRING.fetch text i)
            In
            If And [c >= `0`] [c <= `9`]
                Continue {[i + 1] [[10 * num] + [c - `0`]]}
                'nothing
        ;

Define (show i)
    (Prim show_integer i)

Where

Define (compare a b)
    Cond
    | [a < b] 'less
    | [a > b] 'greater
    | True 'equal
    ;

Define (min a b)
    If [a < b] a b

Define (max a b)
    If [a > b] a b

Define (abs n)
    If [n < 0] -n n

Where

Let STRING Package "string"