-module(recursive). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([rec/1, func/1, func2/1, func3/1, func4/1, func5/1, block/2, block2/3, block3/4, block4/5, block5/6]). -spec rec(fun((fun(() -> FXS)) -> FXS)) -> FXS. rec(F) -> F(fun() -> rec(F) end). -spec func(fun((FXZ, fun((FXZ) -> FXY)) -> FXY)) -> fun((FXZ) -> FXY). func(Cb) -> rec( fun(F) -> fun(A) -> Cb(A, fun(_capture) -> Cb(_capture, F()) end) end end ). -spec func2(fun((FYI, FYJ, fun((FYI, FYJ) -> FYH)) -> FYH)) -> fun((FYI, FYJ) -> FYH). func2(Cb) -> rec( fun(F) -> fun(A, B) -> Cb(A, B, fun(A@1, B@1) -> Cb(A@1, B@1, F()) end) end end ). -spec func3(fun((FYU, FYV, FYW, fun((FYU, FYV, FYW) -> FYT)) -> FYT)) -> fun((FYU, FYV, FYW) -> FYT). func3(Cb) -> rec( fun(F) -> fun(A, B, C) -> Cb(A, B, C, fun(A@1, B@1, C@1) -> Cb(A@1, B@1, C@1, F()) end) end end ). -spec func4(fun((FZJ, FZK, FZL, FZM, fun((FZJ, FZK, FZL, FZM) -> FZI)) -> FZI)) -> fun((FZJ, FZK, FZL, FZM) -> FZI). func4(Cb) -> rec( fun(F) -> fun(A, B, C, D) -> Cb( A, B, C, D, fun(A@1, B@1, C@1, D@1) -> Cb(A@1, B@1, C@1, D@1, F()) end ) end end ). -spec func5( fun((GAB, GAC, GAD, GAE, GAF, fun((GAB, GAC, GAD, GAE, GAF) -> GAA)) -> GAA) ) -> fun((GAB, GAC, GAD, GAE, GAF) -> GAA). func5(Cb) -> rec( fun(F) -> fun(A, B, C, D, E) -> Cb( A, B, C, D, E, fun(A@1, B@1, C@1, D@1, E@1) -> Cb(A@1, B@1, C@1, D@1, E@1, F()) end ) end end ). -spec block(FWS, fun((FWS, fun((FWS) -> GAH)) -> GAH)) -> GAH. block(Initial, Cb) -> (func(Cb))(Initial). -spec block2(FWV, FWW, fun((FWV, FWW, fun((FWV, FWW) -> GAK)) -> GAK)) -> GAK. block2(A, B, Cb) -> (func2(Cb))(A, B). -spec block3( FWZ, FXA, FXB, fun((FWZ, FXA, FXB, fun((FWZ, FXA, FXB) -> GAO)) -> GAO) ) -> GAO. block3(A, B, C, Cb) -> (func3(Cb))(A, B, C). -spec block4( FXE, FXF, FXG, FXH, fun((FXE, FXF, FXG, FXH, fun((FXE, FXF, FXG, FXH) -> GAT)) -> GAT) ) -> GAT. block4(A, B, C, D, Cb) -> (func4(Cb))(A, B, C, D). -spec block5( FXK, FXL, FXM, FXN, FXO, fun((FXK, FXL, FXM, FXN, FXO, fun((FXK, FXL, FXM, FXN, FXO) -> GAZ)) -> GAZ) ) -> GAZ. block5(A, B, C, D, E, Cb) -> (func5(Cb))(A, B, C, D, E).