module Genlet.For_lib.Io
open Stdlib.Asyncseq
open Frduino
open Frduino.Genlet
type pinkind =
| PINKIND_LED_BUILTIN
interface Lib.Io.pinkind
module Pinkind =
let toString = function
| PINKIND_LED_BUILTIN -> "LED_BUILTIN"
type pin_t =
{ pin_digital_name: string
; pin_selectedpin_expr: string
}
interface Lib.Io.t
type Builder() =
interface Lib.Io.Builder with
override __.with_open<'T, 'K>(k: Lib.Io.pinkind): ((Lib.Io.t -> M<'T, 'K>) -> M<'T, 'K>) =
fun f ->
let k = k :?> pinkind
let env = { pin_digital_name = "digital"; pin_selectedpin_expr = Pinkind.toString k }
let env' = env :> Lib.Io.t
let seq = f env' :?> Code<'T, 'K>
let seq_s_0 = seq.s_0 @ [$"pinMode({env.pin_selectedpin_expr}, OUTPUT)"]
{ seq with s_0 = seq_s_0 }
override __.bit_write (t: Lib.Io.t): expr<bool> -> Asyn<unit> =
fun value ->
let value = value :?> CodeExpr<bool>
let str =
match value.x with
| true -> "HIGH"
| false -> "LOW"
let t = t :?> pin_t
new CodeAsyn<unit>(u = $"{t.pin_digital_name}Write({t.pin_selectedpin_expr}, {str})") :> Asyn<unit>
override __.led_builtin with get (): Lib.Io.pinkind =
PINKIND_LED_BUILTIN