Created
November 22, 2022 19:54
-
-
Save EduardoRFS/a5644dd78890e318f511f2f8550dff9a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Main : sig | |
val sum_before_and_after : before:int -> after:int -> int | |
end = struct | |
module Context : sig | |
type error | |
type context | |
val return : int -> context | |
val bind : context -> (int -> context) -> context | |
val level : (level:int -> context) -> context | |
val with_level : level:int -> (unit -> context) -> context | |
val run : context -> int | |
end = struct | |
type error = Lel [@@ocaml.warning "-unused-constructor"] | |
type context = level:int -> ok:(int -> int) -> int | |
let[@inline always] return : int -> context = | |
fun value ~level:_ ~ok -> ok value | |
let[@inline always] bind : context -> (int -> context) -> context = | |
fun context f ~level ~ok -> | |
let ok value = | |
let context = f value in | |
context ~level ~ok | |
in | |
context ~level ~ok | |
let[@inline always] level : (level:int -> context) -> context = | |
fun f ~level ~ok -> f ~level ~level ~ok | |
let[@inline always] with_level : level:int -> (unit -> context) -> context = | |
fun ~level f ~level:_ ~ok -> f () ~level ~ok | |
let[@inline always] run : context -> int = | |
fun context -> | |
let ok value = value in | |
context ~level:0 ~ok | |
end | |
open Context | |
let sum_before_and_after ~before ~after = | |
let before = | |
with_level ~level:before @@ fun () -> | |
level @@ fun ~level -> return level | |
in | |
let after = | |
with_level ~level:after @@ fun () -> | |
bind before @@ fun before -> | |
level @@ fun ~level:after -> return @@ (before + after) | |
in | |
run after | |
end | |
(* flambda2 : | |
camlTest__sum_before_and_after_7_27_code: | |
.cfi_startproc | |
.L100: | |
leaq -1(%rax,%rbx), %rax | |
ret | |
*) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment