Skip to content

Instantly share code, notes, and snippets.

@EduardoRFS
Created November 22, 2022 19:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save EduardoRFS/a5644dd78890e318f511f2f8550dff9a to your computer and use it in GitHub Desktop.
Save EduardoRFS/a5644dd78890e318f511f2f8550dff9a to your computer and use it in GitHub Desktop.
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