namespace Frduino.Genlet.For_lib.Wire
open Stdlib.Asyncseq
open Frduino
open Frduino.Genlet
open Frduino.Lib.Wire
type Session<'W when wireable<'W>> =
{ wire_name : string
wire_device : 'W }
interface t<'W>
type Writer<'W when wireable<'W>>(session: Session<'W>) =
member __.t with get() = session
interface writer<'W>
type Builder() =
interface Lib.Wire.Builder with
override __.with_open_1<'W, 'T, 'K when wireable<'W>> f =
let dev = new 'W ()
let t = { wire_name = "Wire"; wire_device = dev } : Session<'W>
let m = (f (t :> t<'W>) :> M<'T, 'K>) :?> Code<'T, 'K>
{ m with s_0 = $"{t.wire_name}.begin()" :: $"{t.wire_name}.beginTransmission({t.wire_device.id})" :: $"{t.wire_name}.write(0x6B)" :: $"{t.wire_name}.write(0)" :: $"{t.wire_name}.endTransmission(true)" :: m.s_0; g = "#include \"Wire.h\"" :: m.g } :> M<'T, 'K>
override __.Buf_write__with_trnms<'W when wireable<'W>> t f =
let t = t :?> Session<'W>
let wr = new Writer<'W>(t)
let cexpr = f (wr :> writer<'W>) :?> CodeAsyn<unit>
let extension_acc = match cexpr.extension with None -> [$"/* await */ {cexpr.u}"] | Some ext -> ext @ [cexpr.u]
let extension = Some ([$"/* await */ {t.wire_name}.beginTransmission({t.wire_device.id})"] @ extension_acc @ [$"/* await */ {t.wire_name}.endTransmission(false)"])
new CodeAsyn<unit>(u = "NAN", extension = extension) :> Asyn<unit>
override __.Flow__write_byte<'W when wireable<'W>> (wr: writer<'W>) x =
let wr = wr :?> Writer<'W>
let x = x :?> CodeExpr<int>
new CodeAsyn<unit>(u = $"{wr.t.wire_name}.write({x.n})") :> Asyn<unit>
override __.Request_for__n_from<'W when wireable<'W>> n (t: t<'W>) =
let t = t :?> Session<'W>
let ls = List.init n (fun _ -> $"{t.wire_name}.read()")
new CodeAsynN<int>(u = $"{t.wire_name}.requestFrom({t.wire_device.id}, {n.ToString()}, true)", ls = ls) :> asyn_n<int>