namespace Frduino.Genlet.For_lib.Math.Double

open Frduino
open Frduino.Genlet

type Builder() =
interface Lib.Math.Double.Builder with
override __.atan x =
let x = x :?> CodeExpr<double>
new CodeExpr<double>(n = $"atan({x.n})")
override __.sqrt x =
let x = x :?> CodeExpr<double>
new CodeExpr<double>(n = $"sqrt({x.n})")
override __.add x = fun y ->
let x = x :?> CodeExpr<double>
let y = y :?> CodeExpr<double>
new CodeExpr<double>(n = $"({x.n}) + ({y.n})")
override __.mul x = fun y ->
let x = x :?> CodeExpr<double>
let y = y :?> CodeExpr<double>
new CodeExpr<double>(n = $"({x.n}) * ({y.n})")
override __.div x = fun y ->
let x = x :?> CodeExpr<double>
let y = y :?> CodeExpr<double>
new CodeExpr<double>(n = $"({x.n}) / ({y.n})")

namespace Frduino.Genlet.For_lib.Math.Int

open Frduino
open Frduino.Genlet

type Builder() =
interface Lib.Math.Int.Builder with
override __.add x = fun y ->
let x = x :?> CodeExpr<int>
let y = y :?> CodeExpr<int>
new CodeExpr<int>(n = $"({x.n}) + ({y.n})")