//@NO-IMPLICIT-PRELUDE
//! The signed 64-bit integer type.
let { Semigroup } = import! std.semigroup
let { Monoid } = import! std.monoid
let { Group } = import! std.group
let { Eq, Ord, Ordering } = import! std.cmp
let { Num } = import! std.num
let { Show } = import! std.show
let additive =
let semigroup : Semigroup Int = {
append = \x y -> x #Int+ y
}
let monoid : Monoid Int = {
semigroup = semigroup,
empty = 0,
}
let group : Group Int = {
monoid = monoid,
inverse = \x -> 0 #Int- x,
}
{ semigroup, monoid, group }
let multiplicative =
let semigroup : Semigroup Int = {
append = \x y -> x #Int* y
}
let monoid : Monoid Int = {
semigroup = semigroup,
empty = 1,
}
{ semigroup, monoid }
let eq : Eq Int = {
(==) = \l r -> l #Int== r
}
let ord : Ord Int = {
eq = eq,
compare = \l r -> if l #Int< r then LT else if l #Int== r then EQ else GT,
}
let num : Num Int = {
ord = ord,
(+) = additive.semigroup.append,
(-) = \l r -> l #Int- r,
(*) = multiplicative.semigroup.append,
(/) = \l r -> l #Int/ r,
negate = additive.group.inverse,
}
let show : Show Int = {
show = (import! std.prim).show_int
}
{
additive,
multiplicative,
eq,
ord,
num,
show,
..
import! std.int.prim
}