fun/recursion-schemes.bruijn


# uses Generic/Schemes.bruijn for ana/cata/para/etc.

:import std/Number .
:import std/Combinator .
:import std/Tuples .

# ===== #
# lists #
# ===== #

:import std/List/Church .

# example list
list (+1) : ((+2) : {}(+3))

sum cata ([[[2 + 1]]] : (+0))

:test (list.sum =? (+6)) ([[1]])

length cata ([[[++1]]] : (+0))

:test (list.length =? (+3)) ([[1]])

tails para ([[[1 [[(4 : 1) : 0]]]]] : {}empty)

:test (list.tails) (list : (~list : (~(~list) : {}empty)))

# ======= #
# numbers #
# ======= #

:import std/Number/Ternary .

fac para ([(+1)] : &[[0 ⋅ ++1]]) ⧗ Number → Number

# ==== #
# meta #
# ==== #

:import std/Meta .
:import std/Number/Conversion .

length cata (case-idx : case-app : case-abs)
	case-idx (add (+2)) ∘ unary→ternary
	case-app (add (+2)) ∘∘ add
	case-abs add (+2)

:test (length `[0]) ((+4))
:test (length `[[1 1]]) ((+12))

main [[0]]