id|T|(x: T): T = x
assert id(1) == 1
assert id(True) == True
assert id("hello") == "hello"

const|T, C|(c: C): (T -> C) = (_: T,) -> c
print! const(1)(2)
assert const(True)(2) == True

print_to_str!|S <: Show|(s: S): Str =
    print! s
    s.__str__()

discard print_to_str!(1)

add1 x: Int = x + 1
then|T|(x: T or NoneType, f: (a: T) -> T) =
    match x:
        None -> x
        (y: T) -> f y
assert then(1, add1) == 2
assert then(None, add1) == None
