open import Agda.Builtin.Nat using (Nat; _+_; _*_)
open import Agda.Builtin.Bool using (Bool; true; false)
add : Nat → Nat → Nat
add = _+_
add2l : Nat → Nat
add2l = 2 +_
add2r : Nat → Nat
add2r = _+ 2
add3 : Nat → Nat → Nat → Nat
add3 x y = (x + y) +_
maybeAddL : Bool → Nat → Nat
maybeAddL true = 40 +_
maybeAddL false = 10 +_
maybeAddLb : Bool → Nat → Nat
maybeAddLb true = λ x → 40 + x
maybeAddLb false = λ x → 10 + x
maybeAddR : Bool → Nat → Nat
maybeAddR true = _+ 40
maybeAddR false = _+ 10
maybeAddRb : Bool → Nat → Nat
maybeAddRb true = λ x → x + 40
maybeAddRb false = λ x → x + 10
maybeAdd : Bool → Nat → Nat → Nat
maybeAdd true = _+_
maybeAdd false = _*_
maybeAdd3 : Bool → Nat → Nat → Nat
maybeAdd3 true x = _+ (40 + x)
maybeAdd3 false x = _+ (10 + x)
maybeAdd3b : Bool → Nat → Nat → Nat
maybeAdd3b true x y = y + (40 + x)
maybeAdd3b false x y = y + (10 + x)
data Maybe (A : Set) : Set where
nothing : Maybe A
just : A → Maybe A
maybeInc : Maybe Nat → Nat → Nat
maybeInc (just y) x = x + y
maybeInc nothing x = x
maybeAddM : Maybe Nat → Nat → Nat → Nat
maybeAddM (just z) x y = x + y + z
maybeAddM nothing x y = x + y
maybeIncInc : Maybe (Maybe Nat) → Nat → Nat
maybeIncInc (just (just y)) x = x + y
maybeIncInc (just nothing) x = x + 1
maybeIncInc nothing x = x
maybeIncInc2 : Maybe (Maybe Nat) → Nat → Nat → Nat
maybeIncInc2 (just (just z)) x y = x + y + z
maybeIncInc2 (just nothing) x y = x + y + 1
maybeIncInc2 nothing x y = x + y
{-# FOREIGN AGDA2RUST
pub fn main() {
println!("{}:\t {} | {} | {} | {} |\
{} | {} | {} | {} | {} | {} | {} | {} |\
{} | {} | {} | {}", module_path!(),
add(40, 2),
add2l(40),
add2r(40),
add3(40, 1, 1),
maybeAddL(true, 2),
maybeAddLb(true, 2),
maybeAddR(true, 2),
maybeAddRb(true, 2),
maybeAdd(true, 40, 2),
maybeAdd(false, 2, 21),
maybeAdd3(true, 1, 1),
maybeAdd3b(true, 1, 1),
maybeInc(Maybe::just(40), 2),
maybeAddM(Maybe::just(40), 1, 1),
maybeIncInc(Maybe::just(Maybe::just(40)), 2),
maybeIncInc2(Maybe::just(Maybe::just(40)), 1, 1),
);
}
#-}