namespace UnityPeripherals

open Stdlib.Asyncseq
open Frduino

type serial =
{ serial_name : string }

type serial with
static member v () =
{ serial_name = "Serial" }

type editor_os<'T, 'TParam, 'TBuilder when 'TBuilder :> Stdlib.Serializable<'T, 'TParam>>(o: syntax<'T, 'TParam, 'TBuilder>) =
let baud_linux = 9600
let serial = serial.v ()

abstract member PullStream : Lib.Async.env -> M<'T, unit>
default __.PullStream _ =
let s = o.asyncseq.Zero<unit>() :?> Genlet.Code<'T, unit>
let g = [
"template<typename A, typename B, typename C>
struct tuple3 {
A itemA; B itemB; C itemC;
tuple3(A a, B b, C c) : itemA(a), itemB(b), itemC(c) {}
};

template<typename A, typename B, typename C> tuple3<A, B, C> make_tuple3(A a, B b, C c) { return tuple3<A,B,C> { a,b,c }; }"
]
let s_0 = [
$"{serial.serial_name}.begin({baud_linux})" ]
{ s with g = g; s_0 = s_0 }

type editor_os_1<'T, 'TParam, 'TBuilder when 'TBuilder :> Stdlib.Serializable<'T, 'TParam>>(o: syntax<'T, 'TParam, 'TBuilder>) =
inherit editor_os<'T, 'TParam, 'TBuilder>(o)
let baud_linux = 9600
let serial = serial.v ()

override __.PullStream env =
let s = o.asyncseq.Zero<unit>() :?> Genlet.Code<'T, unit>
let g = [
"template<typename A, typename B, typename C>
struct tuple3 {
A itemA; B itemB; C itemC;
tuple3(A a, B b, C c) : itemA(a), itemB(b), itemC(c) {}
};

template<typename A, typename B, typename C> tuple3<A, B, C> make_tuple3(A a, B b, C c) { return tuple3<A,B,C> { a,b,c }; }"
]
let s_0 = [
$"{serial.serial_name}.begin({baud_linux})" ]
{ s with g = g; s_0 = s_0 }

abstract member seq : Lib.Async.env -> M<'T, unit> with get
default self.seq with get env =
self.PullStream env