{"version":3,"sources":["file:///home/runner/work/kast-game-example/kast-game-example/src/lib/ugli.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/op.ks","file:///home/runner/work/kast-game-example/kast-game-example/src/lib/gl/gl.ks","file:///home/runner/work/kast-game-example/kast-game-example/src/lib/js.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/syntax.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/collections/treap.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/random.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/cmp.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/lib.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/collections/array_list.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/collections/ord_map.ks","file:///home/runner/work/kast-game-example/kast-game-example/src/lib/geng/asset.ks","file:///home/runner/work/kast-game-example/kast-game-example/src/lib/geng/audio.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/string.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/convert.ks","file:///home/runner/work/kast-game-example/kast-game-example/src/lib/common.ks","file:///home/runner/work/kast-game-example/kast-game-example/src/lib/geng/_lib.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/option.ks","file:///home/runner/work/kast-game-example/kast-game-example/src/lib/web.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/collections/queue.ks","file:///home/runner/work/kast-game-example/kast-game-example/src/lib/geng/input.ks","file:///home/runner/work/kast-game-example/kast-game-example/src/main.ks","file:///home/runner/work/kast-game-example/kast-game-example/src/lib/font.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/collections/slist.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/dbg.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/fs.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/io.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/iter.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/path.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/range.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/sys.ks","file:///home/runner/work/kast-game-example/kast-game-example/src/lib/la.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/char.ks","file:///nix/store/ix9bmmjfs6qq39dv15rir8ri456alan4-kast-0.3.0/lib/std/net.ks","file:///home/runner/work/kast-game-example/kast-game-example/src/lib/obj.ks","file:///home/runner/work/kast-game-example/kast-game-example/src/lib/_lib.ks"],"sourcesContent":["use (import \"./la.ks\").*;\nconst js = import \"./js.ks\";\nconst web = import \"./web.ks\";\nconst gl = import \"./gl/gl.ks\";\n\nuse std.collections.OrdMap;\n\n@syntax \"js_call\" 30 @wrap never = \"@js_call\" \" \" js _=(@wrap if_any \"(\" \"\"/\"\\n\\t\" args:any \"\"/\"\\\\\\n\" \")\");\nimpl syntax (@js_call js(args)) = `(\n    (@native (\"async(ctx,...args)=>{return await(\" + $js + \")(...args)}\"))($args)\n);\n@syntax \"js_call_method\" 30 @wrap never = \"@js_call\" \" \" obj \".\" js _=(@wrap if_any \"(\" \"\"/\"\\n\\t\" args:any \"\"/\"\\\\\\n\" \")\");\nimpl syntax (@js_call obj.js(args)) = `(\n    (@native (\"async(ctx,o,...args)=>{return await o.\" + $js + \"(...args)}\"))($obj, ...{ $args })\n);\n\nmodule:\n\nconst clear = (color :: Vec4) => (\n    gl.clear_color(...color);\n    gl.clear(gl.COLOR_BUFFER_BIT);\n);\n\nconst SizedType = [Self] newtype {\n    .size :: Int32,\n};\n\nimpl Float32 as SizedType = {\n    .size = 4,\n};\n\nconst compile_shader = (shader_type, source) => (\n    let shader = gl.create_shader(shader_type)\n        |> Option.unwrap;\n    gl.shader_source(shader, source);\n    gl.compile_shader(shader);\n    let compile_status = gl.get_shader_parameter_bool(\n        shader, gl.COMPILE_STATUS\n    );\n    if not compile_status then (\n        let log = gl.get_shader_info_log(shader);\n        panic(\"Shader compilation failed: \" + log);\n    );\n    shader\n);\n\nconst AttributeInfo = newtype {\n    .raw :: gl.ActiveInfo,\n    .index :: Int32,\n};\n\nconst UniformInfo = newtype {\n    .raw :: gl.ActiveInfo,\n    .location :: gl.WebGLUniformLocation,\n    .index :: Int32,\n};\n\nconst Program = newtype {\n    .ctx :: gl.ContextT,\n    .handle :: gl.Program,\n    .attributes :: OrdMap.t[String, AttributeInfo],\n    .uniforms :: OrdMap.t[String, UniformInfo],\n};\n\nimpl Program as module = (\n    module:\n    \n    const init = (\n        vertex_shader :: gl.Shader,\n        fragment_shader :: gl.Shader,\n    ) -> Program => (\n        let ctx = (@current gl.Context);\n        let program = gl.create_program()\n            |> Option.unwrap;\n        gl.attach_shader(program, vertex_shader);\n        gl.attach_shader(program, fragment_shader);\n        gl.link_program(program);\n        let link_status = gl.get_program_parameter_bool(program, gl.LINK_STATUS);\n        if not link_status then (\n            let log = gl.get_program_info_log(program);\n            panic(\"Program link failed: \" + log);\n        );\n        let active_attributes = gl.get_program_parameter_int(program, gl.ACTIVE_ATTRIBUTES);\n        let mut attributes = OrdMap.new();\n        for index in 0..active_attributes do (\n            let active_info = gl.get_active_attrib(program, index);\n            if active_info.size != 1 then (\n                dbg.print(active_info);\n                panic(\"active_info.size != 1\");\n            );\n            let attribute_info = {\n                .raw = active_info,\n                .index,\n            };\n            OrdMap.add(&mut attributes, attribute_info.raw.name, attribute_info);\n        );\n        let active_uniforms = gl.get_program_parameter_int(program, gl.ACTIVE_UNIFORMS);\n        let mut uniforms = OrdMap.new();\n        for index in 0..active_uniforms do (\n            let active_info = gl.get_active_uniform(program, index);\n            if active_info.size != 1 then (\n                dbg.print(active_info);\n                panic(\"active_info.size != 1\");\n            );\n            let location = gl.get_uniform_location(program, active_info.name)\n                |> Option.unwrap;\n            let uniform_info = {\n                .raw = active_info,\n                .location,\n                .index,\n            };\n            OrdMap.add(&mut uniforms, uniform_info.raw.name, uniform_info);\n        );\n        {\n            .ctx,\n            .handle = program,\n            .attributes,\n            .uniforms,\n        }\n    );\n    \n    const @\"use\" = (program :: Program) => (\n        gl.use_program(program.handle);\n    );\n);\n\nconst Texture = newtype {\n    .size :: Vec2,\n    .handle :: gl.WebGLTexture,\n};\n\nconst Filter = newtype (\n    | :Nearest\n    | :Linear\n);\n\nconst Wrap = newtype (\n    | :Repeat\n    | :ClampToEdge\n);\n\nimpl Wrap as module = (\n    module:\n    \n    const to_gl = (wrap :: Wrap) -> gl.GLenum => (\n        match wrap with (\n            | :Repeat => gl.REPEAT\n            | :ClampToEdge => gl.CLAMP_TO_EDGE\n        )\n    );\n);\n\nimpl Texture as module = (\n    module:\n    \n    const init = (\n        image :: web.HtmlImageElement,\n        filter :: Filter,\n    ) -> Texture => (\n        let handle = gl.create_texture();\n        gl.bind_texture(gl.TEXTURE_2D, handle);\n        gl.pixel_store_bool(gl.UNPACK_FLIP_Y_WEBGL, true);\n        gl.pixel_store_bool(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n        gl.tex_parameter_i(\n            gl.TEXTURE_2D,\n            gl.TEXTURE_MIN_FILTER,\n            gl.LINEAR,\n        );\n        match filter with (\n            | :Linear => ()\n            | :Nearest => (\n                gl.tex_parameter_i(\n                    gl.TEXTURE_2D,\n                    gl.TEXTURE_MAG_FILTER,\n                    gl.NEAREST\n                );\n            )\n        );\n        gl.tex_image_2d(\n            gl.TEXTURE_2D,\n            0,\n            gl.RGBA,\n            gl.RGBA,\n            gl.UNSIGNED_BYTE,\n            image |> js.into_any\n        );\n        # gl.generate_mipmap(gl.TEXTURE_2D);\n        gl.tex_parameter_i(\n            gl.TEXTURE_2D,\n            gl.TEXTURE_WRAP_S,\n            gl.CLAMP_TO_EDGE,\n        );\n        gl.tex_parameter_i(\n            gl.TEXTURE_2D,\n            gl.TEXTURE_WRAP_T,\n            gl.CLAMP_TO_EDGE,\n        );\n        {\n            .size = { image.naturalWidth, image.naturalHeight },\n            .handle,\n        }\n    );\n    \n    const set_wrap_separate = (\n        texture :: &mut Texture,\n        s :: Wrap,\n        t :: Wrap,\n    ) -> () => (\n        gl.bind_texture(gl.TEXTURE_2D, texture^.handle);\n        gl.tex_parameter_i(\n            gl.TEXTURE_2D,\n            gl.TEXTURE_WRAP_S,\n            s |> Wrap.to_gl,\n        );\n        gl.tex_parameter_i(\n            gl.TEXTURE_2D,\n            gl.TEXTURE_WRAP_T,\n            t |> Wrap.to_gl,\n        );\n    );\n);\n\nconst VertexAttributeType = newtype {\n    .size :: gl.GLint,\n    .@\"type\" :: gl.GLenum,\n    .type_size :: Int32,\n};\n\nconst VertexAttribute = [Self] newtype {\n    .@\"type\" :: VertexAttributeType,\n    .construct_data :: &ArrayList.t[Self] -> js.Any,\n};\n\nimpl Vec2 as VertexAttribute = {\n    .@\"type\" = {\n        .size = 2,\n        .@\"type\" = gl.FLOAT,\n        .type_size = 4,\n    },\n    .construct_data = data => (\n        let list = js.List.init();\n        for &{ x, y } in ArrayList.iter(data) do (\n            list |> js.List.push(x);\n            list |> js.List.push(y);\n        );\n        js.new_float32_array(list)\n    ),\n};\n\nimpl Vec3 as VertexAttribute = {\n    .@\"type\" = {\n        .size = 3,\n        .@\"type\" = gl.FLOAT,\n        .type_size = 4,\n    },\n    .construct_data = data => (\n        let list = js.List.init();\n        for &{ x, y, z } in ArrayList.iter(data) do (\n            list |> js.List.push(x);\n            list |> js.List.push(y);\n            list |> js.List.push(z);\n        );\n        js.new_float32_array(list)\n    ),\n};\n\nimpl Vec4 as VertexAttribute = {\n    .@\"type\" = {\n        .size = 4,\n        .@\"type\" = gl.FLOAT,\n        .type_size = 4,\n    },\n    .construct_data = data => (\n        let list = js.List.init();\n        for &{ x, y, z, w } in ArrayList.iter(data) do (\n            list |> js.List.push(x);\n            list |> js.List.push(y);\n            list |> js.List.push(z);\n            list |> js.List.push(w);\n        );\n        js.new_float32_array(list)\n    ),\n};\n\nconst DrawState = newtype {\n    .active_texture_index :: Int32,\n};\n\nimpl DrawState as module = (\n    module:\n    \n    const init = () -> DrawState => (\n        let ctx = (@current gl.Context);\n        \n        gl.enable(gl.BLEND);\n        gl.blend_func_separate(\n            gl.SRC_ALPHA,\n            gl.ONE_MINUS_SRC_ALPHA,\n            gl.ONE_MINUS_DST_ALPHA,\n            gl.ONE,\n        );\n        \n        { .active_texture_index = 0 }\n    );\n);\n\nconst Uniform = [Self] newtype {\n    .set :: (gl.WebGLUniformLocation, Self, &mut DrawState) -> (),\n};\n\nimpl Float32 as Uniform = {\n    .set = (location, x, state) => (\n        let ctx = (@current gl.Context);\n        let list = js.List.init();\n        @js_call ctx.\"uniform1f\"(location, x);\n    ),\n};\n\nimpl Vec2 as Uniform = {\n    .set = (location, value, state) => (\n        let ctx = (@current gl.Context);\n        let list = js.List.init();\n        let { x, y } = value;\n        @js_call ctx.\"uniform2f\"(location, x, y);\n    ),\n};\n\nimpl Vec3 as Uniform = {\n    .set = (location, value, state) => (\n        let ctx = (@current gl.Context);\n        let list = js.List.init();\n        let { x, y, z } = value;\n        @js_call ctx.\"uniform3f\"(location, x, y, z);\n    ),\n};\n\nimpl Vec4 as Uniform = {\n    .set = (location, value, state) => (\n        let ctx = (@current gl.Context);\n        let list = js.List.init();\n        let { x, y, z, w } = value;\n        @js_call ctx.\"uniform4f\"(location, x, y, z, w);\n    ),\n};\n\nimpl Mat3 as Uniform = {\n    .set = (location, value, state) => (\n        let ctx = (@current gl.Context);\n        let list = js.List.init();\n        let { a, b, c } = value;\n        let add = (f) => (\n            list |> js.List.push(f(a));\n            list |> js.List.push(f(b));\n            list |> js.List.push(f(c));\n        );\n        add(row => row.0);\n        add(row => row.1);\n        add(row => row.2);\n        let data = js.new_float32_array(list);\n        @js_call ctx.\"uniformMatrix3fv\"(location, false, data);\n    ),\n};\n\nimpl Texture as Uniform = {\n    .set = (location, texture, state) => (\n        let ctx = (@current gl.Context);\n        @js_call ctx.\"activeTexture\"(gl.TEXTURE0 + state^.active_texture_index);\n        gl.bind_texture(gl.TEXTURE_2D, texture.handle);\n        @js_call ctx.\"uniform1i\"(location, state^.active_texture_index);\n        state^.active_texture_index += 1;\n    ),\n};\n\nconst set_uniform = [T] (\n    program :: Program,\n    name :: String,\n    value :: T,\n    state :: &mut DrawState,\n) -> () => with_return (\n    let ctx = program.ctx;\n    let uniform_info = match &program.uniforms |> OrdMap.get(name) with (\n        | :Some (info) => info\n        | :None => return\n    );\n    (T as Uniform).set(uniform_info^.location, value, state);\n);\n\nconst Vertex = [Self] newtype {\n    .init_fields :: (&ArrayList.t[Self], (String, VertexBuffer.Field) -> ()) -> (),\n};\n\nconst Vertex_derive = (ty :: Type) -> std.Ast => @cfg (\n    | target.name == \"interpreter\" => match std.reflection.type_info(ty) with (\n        | :Tuple { .unnamed, .named } => (\n            match unnamed with (\n                | :Nil => ()\n                | :Cons _ => panic(\"Expected zero unnamed fields\")\n            );\n            const f = `(f);\n            const data = `(data);\n            let mut init_fields = `();\n            for &{ name, field_ty } in std.collections.SList.iter(&named) do (\n                let name_ident = std.Ast.ident(name);\n                init_fields = `(\n                    $init_fields;\n                    $f(name, VertexBuffer.init_field($data, v => v^.$name_ident));\n                );\n            );\n            `(\n                impl ty as Vertex = {\n                    .init_fields = ($data, $f) => (\n                        $init_fields\n                    ),\n                };\n            )\n        )\n        | _ => panic(\"Can't derive vertex\")\n    )\n    | true => panic(\"Only usable at comptime\")\n);\n\nconst VertexBuffer = (\n    module:\n    \n    const Field = newtype {\n        .buffer :: gl.Buffer,\n        .stride :: Int32,\n        .offset :: Int32,\n        .@\"type\" :: VertexAttributeType,\n    };\n    \n    const t = [V] newtype {\n        .fields :: OrdMap.t[String, Field],\n    };\n    \n    const init = [V] (data :: &ArrayList.t[V]) -> t[V] => (\n        let mut fields = OrdMap.new();\n        (V as Vertex).init_fields(\n            data,\n            (name, field) => (\n                OrdMap.add(&mut fields, name, field);\n            )\n        );\n        { .fields }\n    );\n    \n    const init_field = [V, T] (\n        data :: &ArrayList.t[V],\n        get :: &V -> T,\n    ) -> Field => (\n        let mut field_data = ArrayList.new();\n        for vertex in ArrayList.iter(data) do (\n            let field = get(vertex);\n            &mut field_data |> ArrayList.push_back(field);\n        );\n        let field_data = (T as VertexAttribute).construct_data(&field_data);\n        \n        let buffer = gl.create_buffer();\n        gl.bind_buffer(gl.ARRAY_BUFFER, buffer);\n        gl.buffer_data(gl.ARRAY_BUFFER, field_data, gl.STATIC_DRAW);\n        \n        let offset = 0;\n        let @\"type\" = (T as VertexAttribute).@\"type\";\n        let stride = @\"type\".size * @\"type\".type_size;\n        {\n            .buffer,\n            .stride,\n            .offset,\n            .@\"type\",\n        }\n    );\n);\n\nconst set_vertex_data_source = [V] (\n    program :: Program,\n    buffer :: VertexBuffer.t[V],\n) -> () => (\n    let ctx = program.ctx;\n    for &{ .key = name, .value = field } in &buffer.fields |> OrdMap.iter do (\n        let attribute_info = match &program.attributes |> OrdMap.get(name) with (\n            | :Some (info) => info\n            | :None => continue\n        );\n        gl.bind_buffer(gl.ARRAY_BUFFER, field.buffer);\n        gl.vertex_attrib_pointer(\n            attribute_info^.index,\n            field.@\"type\".size,\n            field.@\"type\".@\"type\",\n            false,\n            field.stride,\n            field.offset,\n        );\n        gl.enable_vertex_attrib_array(attribute_info^.index);\n    );\n);\n","module:\nconst neg = [T] (x :: T) -> T => @cfg (\n    | target.name == \"interpreter\" => (@native \"unary -\")(x)\n    | target.name == \"javascript\" => (@native \"Kast.op.neg\")(x)\n);\nconst pos = [T] (x :: T) -> T => (\n    x\n);\nconst add = [T] (a :: T, b :: T) -> T => (\n    @cfg (\n        | target.name == \"interpreter\" => (@native \"+\")(a, b)\n        | target.name == \"ocaml\" => @native \"({a} + {b})\"\n        | target.name == \"javascript\" => (@native \"Kast.op.add\")(a, b)\n    )\n);\nconst sub = [T] (a :: T, b :: T) -> T => (\n    @cfg (\n        | target.name == \"interpreter\" => (@native \"-\")(a, b)\n        | target.name == \"ocaml\" => @native \"({a} - {b})\"\n        | target.name == \"javascript\" => (@native \"Kast.op.sub\")(a, b)\n    )\n);\nconst mul = [T] (a :: T, b :: T) -> T => (\n    @cfg (\n        | target.name == \"interpreter\" => (@native \"*\")(a, b)\n        | target.name == \"ocaml\" => @native \"({a} * {b})\"\n        | target.name == \"javascript\" => (@native \"Kast.op.mul\")(a, b)\n    )\n);\nconst div = [T] (a :: T, b :: T) -> T => @cfg (\n    | target.name == \"interpreter\" => (@native \"/\")(a, b)\n    | target.name == \"ocaml\" => @native \"({a} / {b})\"\n    | target.name == \"javascript\" => (@native \"Kast.op.div_temp\")(T, a, b)\n);\nconst rem = [T] (a :: T, b :: T) -> T => @cfg (\n    | target.name == \"interpreter\" => (@native \"%\")(a, b)\n    | target.name == \"javascript\" => (@native \"Kast.op.rem\")(a, b)\n);\nconst bit_and = [T] (a :: T, b :: T) -> T => @cfg (\n    | target.name == \"interpreter\" => (@native \"bit_and\")(a, b)\n    | target.name == \"javascript\" => (@native \"Kast.op.bit_and\")(a, b)\n);\nconst bit_or = [T] (a :: T, b :: T) -> T => @cfg (\n    | target.name == \"interpreter\" => (@native \"bit_or\")(a, b)\n    | target.name == \"javascript\" => (@native \"Kast.op.bit_or\")(a, b)\n);\nconst bit_xor = [T] (a :: T, b :: T) -> T => @cfg (\n    | target.name == \"interpreter\" => (@native \"bit_xor\")(a, b)\n    | target.name == \"javascript\" => (@native \"Kast.op.bit_xor\")(a, b)\n);\nconst bit_not = [T] (x :: T) -> T => @cfg (\n    | target.name == \"interpreter\" => (@native \"bit_not\")(x)\n    | target.name == \"javascript\" => (@native \"Kast.op.bit_not\")(x)\n);\nconst bit_shift_left = [T] (a :: T, b :: T) -> T => @cfg (\n    | target.name == \"interpreter\" => (@native \"bit_shift_left\")(a, b)\n    | target.name == \"javascript\" => (@native \"Kast.op.bit_shift_left\")(a, b)\n);\nconst bit_shift_right = [T] (a :: T, b :: T) -> T => @cfg (\n    | target.name == \"interpreter\" => (@native \"bit_shift_right\")(a, b)\n    | target.name == \"javascript\" => (@native \"Kast.op.bit_shift_right\")(a, b)\n);\n","const js = import \"../js.ks\";\nconst web = import \"../web.ks\";\n\n@syntax \"js_call\" 30 @wrap never = \"@js_call\" \" \" js _=(@wrap if_any \"(\" \"\"/\"\\n\\t\" args:any \"\"/\"\\\\\\n\" \")\");\nimpl syntax (@js_call js(args)) = `(\n    (@native (\"async(ctx,...args)=>{return await(\" + $js + \")(...args)}\"))($args)\n);\n@syntax \"js_call_method\" 30 @wrap never = \"@js_call\" \" \" obj \".\" js _=(@wrap if_any \"(\" \"\"/\"\\n\\t\" args:any \"\"/\"\\\\\\n\" \")\");\nimpl syntax (@js_call obj.js(args)) = `(\n    (@native (\"async(ctx,o,...args)=>{return await o.\" + $js + \"(...args)}\"))($obj, ...{ $args })\n);\n\nmodule:\n\ninclude \"./types.ks\";\ninclude \"./constants.ks\";\n\nconst ContextT = web.WebGLRenderingContext;\nconst Context = @context ContextT;\n\nconst clear = (bits :: GLbitfield) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"clear\"(bits)\n);\n\nconst clear_color = (\n    r :: GLclampf,\n    g :: GLclampf,\n    b :: GLclampf,\n    a :: GLclampf,\n) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"clearColor\"(r, g, b, a)\n);\n\nconst create_shader = (shader_type :: GLenum) -> Option.t[Shader] => (\n    let ctx = (@current Context);\n    @js_call ctx.\"createShader\"(shader_type)\n        |> js.check_null\n);\n\nconst shader_source = (\n    shader :: Shader,\n    source :: String,\n) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"shaderSource\"(shader, source)\n);\n\nconst compile_shader = (shader :: Shader) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"compileShader\"(shader)\n);\n\nconst get_shader_parameter_bool = (\n    shader :: Shader,\n    pname :: GLenum,\n) -> GLboolean => (\n    let ctx = (@current Context);\n    @js_call ctx.\"getShaderParameter\"(shader, pname)\n);\n\nconst get_shader_info_log = (shader :: Shader) -> String => (\n    let ctx = (@current Context);\n    @js_call ctx.\"getShaderInfoLog\"(shader)\n);\n\nconst create_program = () -> Option.t[Program] => (\n    let ctx = (@current Context);\n    @js_call ctx.\"createProgram\"()\n        |> js.check_null\n);\n\nconst attach_shader = (\n    program :: Program,\n    shader :: Shader,\n) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"attachShader\"(program, shader)\n);\n\nconst link_program = (program :: Program) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"linkProgram\"(program)\n);\n\nconst get_program_parameter_bool = (\n    program :: Program,\n    pname :: GLenum,\n) -> GLboolean => (\n    let ctx = (@current Context);\n    @js_call ctx.\"getProgramParameter\"(program, pname)\n);\n\nconst get_program_parameter_int = (\n    program :: Program,\n    pname :: GLenum,\n) -> GLint => (\n    let ctx = (@current Context);\n    @js_call ctx.\"getProgramParameter\"(program, pname)\n);\n\nconst get_program_info_log = (program :: Program) -> String => (\n    let ctx = (@current Context);\n    @js_call ctx.\"getProgramInfoLog\"(program)\n);\n\nconst use_program = (program :: Program) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"useProgram\"(program)\n);\n\nconst draw_arrays = (\n    mode :: GLenum,\n    first :: GLint,\n    count :: GLsizei,\n) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"drawArrays\"(mode, first, count)\n);\n\nconst create_buffer = () -> Buffer => (\n    let ctx = (@current Context);\n    @js_call ctx.\"createBuffer\"()\n);\n\nconst bind_buffer = (\n    target :: GLenum,\n    buffer :: Buffer,\n) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"bindBuffer\"(target, buffer)\n);\n\nconst buffer_data = (\n    target :: GLenum,\n    src_data :: js.Any,\n    usage :: GLenum,\n) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"bufferData\"(target, src_data, usage)\n);\n\nconst vertex_attrib_pointer = (\n    index :: GLuint,\n    size :: GLint,\n    @\"type\" :: GLenum,\n    normalized :: GLboolean,\n    stride :: GLsizei,\n    offset :: GLintptr,\n) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"vertexAttribPointer\"(\n        index, size, @\"type\", normalized, stride, offset\n    )\n);\n\nconst enable = (cap :: GLenum) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"enable\"(cap)\n);\n\nconst blend_color = (\n    red :: GLclampf,\n    green :: GLclampf,\n    blue :: GLclampf,\n    alpha :: GLclampf,\n) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"blendColor\"(red, green, blue, alpha)\n);\n\nconst blend_func = (src_factor :: GLenum, dst_factor :: GLenum) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"blendFunc\"(src_factor, dst_factor)\n);\n\nconst blend_func_separate = (\n    src_rgb :: GLenum,\n    dst_rgb :: GLenum,\n    src_alpha :: GLenum,\n    dst_alpha :: GLenum,\n) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"blendFuncSeparate\"(src_rgb, dst_rgb, src_alpha, dst_alpha)\n);\n\nconst blend_equation = (mode :: GLenum) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"blendEquation\"(mode)\n);\n\nconst blend_equation_separate = (\n    mode_rgb :: GLenum,\n    mode_alpha :: GLenum,\n) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"blendEquationSeparate\"(mode_rgb, mode_alpha)\n);\n\n# blendEq(src * srcFactor, dst * dstFactor)\nconst enable_vertex_attrib_array = (index :: GLuint) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"enableVertexAttribArray\"(index)\n);\n\nconst disable_vertex_attrib_array = (index :: GLuint) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"disableVertexAttribArray\"(index)\n);\n\nconst get_active_attrib = (\n    program :: Program,\n    index :: GLuint,\n) -> ActiveInfo => (\n    let ctx = (@current Context);\n    @js_call ctx.\"getActiveAttrib\"(program, index)\n);\n\nconst get_active_uniform = (\n    program :: Program,\n    index :: GLuint,\n) -> ActiveInfo => (\n    let ctx = (@current Context);\n    @js_call ctx.\"getActiveUniform\"(program, index)\n);\n\nconst get_uniform_location = (\n    program :: Program,\n    name :: String,\n) -> Option.t[WebGLUniformLocation] => (\n    let ctx = (@current Context);\n    @js_call ctx.\"getUniformLocation\"(program, name)\n        |> js.check_null\n);\n\nconst create_texture = () -> WebGLTexture => (\n    let ctx = (@current Context);\n    @js_call ctx.\"createTexture\"()\n);\n\nconst bind_texture = (\n    target :: GLenum,\n    texture :: WebGLTexture,\n) -> WebGLTexture => (\n    let ctx = (@current Context);\n    @js_call ctx.\"bindTexture\"(target, texture)\n);\n\nconst tex_image_2d = (\n    target :: GLenum,\n    level :: GLint,\n    internal_format :: GLenum,\n    format :: GLenum,\n    @\"type\" :: GLenum,\n    source :: js.Any,\n) -> WebGLTexture => (\n    let ctx = (@current Context);\n    @js_call ctx.\"texImage2D\"(target, level, internal_format, format, @\"type\", source)\n);\n\nconst tex_parameter_i = (\n    target :: GLenum,\n    pname :: GLenum,\n    param :: GLint,\n) -> WebGLTexture => (\n    let ctx = (@current Context);\n    @js_call ctx.\"texParameteri\"(target, pname, param)\n);\n\nconst tex_parameter_f = (\n    target :: GLenum,\n    pname :: GLenum,\n    param :: GLfloat,\n) -> WebGLTexture => (\n    let ctx = (@current Context);\n    @js_call ctx.\"texParameterf\"(target, pname, param)\n);\n\nconst generate_mipmap = (target :: GLenum) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"generateMipmap\"(target)\n);\n\nconst pixel_store_bool = (\n    pname :: GLenum,\n    value :: GLboolean,\n) -> () => (\n    let ctx = (@current Context);\n    @js_call ctx.\"pixelStorei\"(pname, value)\n);\n\nconst Shader = @opaque_type;\nconst Program = @opaque_type;\nconst Buffer = @opaque_type;\nconst ActiveInfo = newtype {\n    .name :: String,\n    .size :: GLsizei,\n    .@\"type\" :: GLenum,\n};\nconst WebGLUniformLocation = @opaque_type;\nconst WebGLTexture = @opaque_type;\n","use (import \"./la.ks\").*;\n\n@syntax \"js_call\" 30 @wrap never = \"@js_call\" \" \" js _=(@wrap if_any \"(\" \"\"/\"\\n\\t\" args:any \"\"/\"\\\\\\n\" \")\");\nimpl syntax (@js_call js(args)) = `(\n    (@native (\"async(ctx,...args)=>{return await(\" + $js + \")(...args)}\"))($args)\n);\n@syntax \"js_call_method\" 30 @wrap never = \"@js_call\" \" \" obj \".\" js _=(@wrap if_any \"(\" \"\"/\"\\n\\t\" args:any \"\"/\"\\\\\\n\" \")\");\nimpl syntax (@js_call obj.js(args)) = `(\n    (@native (\"async(ctx,o,...args)=>{return await o.\" + $js + \"(...args)}\"))($obj, ...{ $args })\n);\n\nmodule:\n\nconst Any = @opaque_type;\n\nconst unsafe_cast = [T, U] (a :: T) -> U => (\n    @js_call \"x=>x\"(a)\n);\n\nconst from_any = [T] (any :: Any) -> T => (\n    @js_call \"x=>x\"(any)\n);\n\nconst into_any = [T] (any :: T) -> Any => (\n    @js_call \"x=>x\"(any)\n);\n\nconst is_null = (x :: Any) -> Bool => (\n    @js_call \"x=>(x===null)\"(x)\n);\n\nconst check_null = [T] (a :: Any) -> Option.t[T] => (\n    if a |> is_null then (\n        :None\n    ) else (\n        :Some (a |> from_any)\n    )\n);\n\nconst List = (\n    module:\n    \n    const t = [T] @opaque_type;\n    \n    const init = [T] () -> t[T] => (\n        @native \"[]\"\n    );\n    const push = [T] (list :: t[T], x :: T) -> () => (\n        @js_call list.\"push\"(x)\n    );\n    const iter = [T] (list :: t[T]) -> std.iter.Iterable[T] => {\n        .iter = f => (\n            (@native \"async(ctx,{list,f})=>{for(const x of list){await f(ctx,x)}}\")(\n                .list,\n                .f,\n            );\n        ),\n    };\n);\n\nconst Obj = (\n    module:\n    \n    const t = [T] @opaque_type;\n    \n    const iter = [T] (obj :: t[T]) -> std.iter.Iterable[type { String, T }] => {\n        .iter = f => (\n            (@native \"async(ctx,{obj,f})=>{for(const [key,value]of Object.entries(obj)){await f(ctx,{0:key,1:value})}}\")(\n                .obj,\n                .f,\n            );\n        ),\n    };\n);\n\nconst json_parse = [T] (json :: String) -> T => (\n    @js_call \"JSON.parse\"(json)\n);\n\nconst new_float32_array = (data :: List.t[Float32]) -> Any => (\n    (@native \"(ctx,data)=>new Float32Array(data)\")(data)\n)\n","impl syntax (arg |> f) = `(\n    let _arg = $arg;\n    let _f = $f;\n    _f(_arg)\n);\nimpl syntax (first |> f(args)) = `(\n    let first = $first;\n    let f = $f;\n    f(first, $args)\n);\nimpl syntax (f <| arg) = `(\n    $f($arg)\n);\nimpl syntax (a < b) = `(\n    std.cmp.less[_]($a, $b)\n);\nimpl syntax (a <= b) = `(\n    std.cmp.less_or_equal[_]($a, $b)\n);\nimpl syntax (a == b) = `(\n    std.cmp.equal[_]($a, $b)\n);\nimpl syntax (a != b) = `(\n    std.cmp.not_equal[_]($a, $b)\n);\nimpl syntax (a >= b) = `(\n    std.cmp.greater_or_equal[_]($a, $b)\n);\nimpl syntax (a > b) = `(\n    std.cmp.greater[_]($a, $b)\n);\nimpl syntax (not x) = `(\n    if $x then false else true\n);\nimpl syntax (a + b) = `(\n    std.op.add($a, $b)\n);\nimpl syntax (a - b) = `(\n    std.op.sub($a, $b)\n);\nimpl syntax (a * b) = `(\n    std.op.mul($a, $b)\n);\nimpl syntax (a / b) = `(\n    std.op.div($a, $b)\n);\nimpl syntax (a % b) = `(\n    std.op.rem($a, $b)\n);\nimpl syntax (-x) = `(\n    std.op.neg($x)\n);\nimpl syntax (+x) = `(\n    std.op.pos($x)\n);\nimpl syntax (a += b) = `(\n    let _ref = &mut $a;\n    _ref^ = _ref^ + $b\n);\nimpl syntax (a -= b) = `(\n    let _ref = &mut $a;\n    _ref^ = _ref^ - $b\n);\nimpl syntax (a *= b) = `(\n    let _ref = &mut $a;\n    _ref^ = _ref^ * $b\n);\nimpl syntax (a /= b) = `(\n    let _ref = &mut $a;\n    _ref^ = _ref^ / $b\n);\nimpl syntax (a %= b) = `(\n    let _ref = &mut $a;\n    _ref^ = _ref^ % $b\n);\nimpl syntax (@context ty) = `(\n    (@native \"create_context_type\")($ty)\n);\nimpl syntax (loop ( body )) = `(\n    unwindable loop_block (\n        @eval with std.LoopBlock = loop_block;\n        @loop (\n            unwindable loop_body (\n                @eval with std.LoopBody = loop_body;\n                $body\n            );\n        );\n    );\n);\nimpl syntax (break) = `(\n    unwind (@binding @current std.LoopBlock) ()\n);\nimpl syntax (continue) = `(\n    unwind (@binding @current std.LoopBody) ()\n);\nimpl syntax (let rec pattern = value) = `(\n    let _mod = (\n        module:\n        let $pattern = $value\n    );\n    let $pattern = _mod.$pattern;\n);\nimpl syntax (if cond then stmt) = `(\n    if $cond then $stmt else ()\n);\nimpl syntax (while cond do body) = `(\n    loop (\n        if $cond then $body else break\n    )\n);\nimpl syntax (for pattern in iterable do body) = `(\n    unwindable loop_block (\n        @eval with std.LoopBlock = loop_block;\n        $iterable.iter(\n            $pattern => unwindable loop_body (\n                @eval with std.LoopBody = loop_body;\n                $body;\n            )\n        );\n    );\n);\nimpl syntax (with_return body) = `(\n    unwindable (@no_hygiene _returnable) (\n        # @eval with std.ReturnBlock = returnable;\n        $body\n    )\n);\nimpl syntax (return) = `(\n    unwind (@no_hygiene _returnable) ()\n);\nimpl syntax (return value) = `(\n    unwind (@no_hygiene _returnable) $value\n);\nimpl syntax (@opaque_type) = `(\n    (@native \"new_opaque_type\")()\n);\n\nimpl syntax ([arg] -> body) = `(\n    [_ :: $arg] $body\n);\n\nimpl syntax (start..end) = `(\n    std.range.range($start, $end)\n);\n\nimpl syntax (if value is pattern then body) = `(\n    match $value with (\n        | $pattern => $body\n        | _ => ()\n    )\n);\nimpl syntax (if value is pattern then body else else_body) = `(\n    match $value with (\n        | $pattern => $body\n        | _ => $else_body\n    )\n);\nimpl syntax (macro!(ast)) = `(\n    include_ast $macro(`($ast))\n);\n\nimpl syntax ((:: ty) value) = `($value :: $ty);\n","module:\n\nconst data = [T] newtype {\n    .left :: Treap.t[T],\n    .value :: T,\n    .count :: Int32,\n    .priority :: Int32,\n    .right :: Treap.t[T],\n};\nconst t = [T] newtype (\n    | :Empty\n    | :Node data[T]\n);\n\nconst new = [T] () -> Treap.t[T] => :Empty;\nconst singleton = [T] (value :: T) -> Treap.t[T] => :Node (\n    {\n        .left = :Empty,\n        .right = :Empty,\n        .value,\n        .count = 1,\n        .priority = std.random.gen_range(.min = 0, .max = 1000000000),\n    }\n);\nconst length = [T] (v :: &Treap.t[T]) -> Int32 => (\n    match v^ with (\n        | :Empty => 0\n        | :Node v => v.count\n    )\n);\nconst update_data = [T] (\n    root :: data[T],\n    .left :: Treap.t[T],\n    .right :: Treap.t[T]\n) -> Treap.t[T] => :Node {\n    .value = root.value,\n    .priority = root.priority,\n    .left,\n    .right,\n    .count = 1 + length(&left) + length(&right),\n};\nconst join = [T] (left :: Treap.t[T], right :: Treap.t[T]) -> Treap.t[T] => (\n    match { left, right } with (\n        | { :Empty, :Empty } => :Empty\n        | { :Empty, other } => other\n        | { other, :Empty } => other\n        | { :Node (left_data :: data[T]), :Node (right_data :: data[T]) } => (\n            if left_data.priority > right_data.priority then (\n                update_data(\n                    left_data,\n                    .left = left_data.left,\n                    .right = join[T](left_data.right, right),\n                )\n            ) else (\n                update_data(\n                    right_data,\n                    .left = join[T](left, right_data.left),\n                    .right = right_data.right,\n                )\n            )\n        )\n    )\n);\n# Where does the node we are at belong?\nconst node_split_behavior = [T] newtype (\n    | :LeftSubtree\n    | :RightSubtree\n    | :Node { T, T }\n);\nconst node_splitter = [T] type (\n    &data[T] -> node_split_behavior[T]\n);\n\nconst split = [T] (v :: t[T], f :: node_splitter[T]) -> { t[T], t[T] } => (\n    match v with (\n        | :Empty => { :Empty, :Empty }\n        | :Node node => match f(&node) with (\n            | :RightSubtree => (\n                let { left_left, left_right } = split[T](node.left, f);\n                let node = update_data(\n                    node,\n                    .left = left_right,\n                    .right = node.right,\n                );\n                { left_left, node }\n            )\n            | :LeftSubtree => (\n                let { right_left, right_right } = split[T](node.right, f);\n                let node = update_data(\n                    node,\n                    .left = node.left,\n                    .right = right_left,\n                );\n                { node, right_right }\n            )\n            | :Node { left, right } => (\n                let left = singleton(left);\n                let right = singleton(right);\n                { join(node.left, left), join(right, node.right) }\n            )\n        )\n    )\n);\n\nconst split_at = [T] (v :: Treap.t[T], mut idx :: Int32) -> { Treap.t[T], Treap.t[T] } => (\n    split(\n        v,\n        node => (\n            let this_node_idx = length(&node^.left);\n            if this_node_idx < idx then (\n                idx -= this_node_idx + 1;\n                :LeftSubtree\n            ) else (\n                :RightSubtree\n            )\n        )\n    )\n\n);\nconst at = [T] (v :: &Treap.t[T], idx :: Int32) -> &T => (\n    match v^ with (\n        | :Empty => panic(\"oob\")\n        | :Node v => (\n            if idx == length(&v.left) then (\n                &v.value\n            ) else if idx < length(&v.left) then (\n                at[T](&v.left, idx)\n            ) else (\n                at[T](&v.right, idx - length(&v.left) - 1)\n            )\n        )\n    )\n);\nconst at_mut = [T] (v :: &mut Treap.t[T], idx :: Int32) -> &mut T => (\n    match v^ with (\n        | :Empty => panic(\"oob\")\n        | :Node ref mut v => (\n            if idx == length(&v^.left) then (\n                &mut v^.value\n            ) else if idx < length(&v^.left) then (\n                at_mut[T](&mut v^.left, idx)\n            ) else (\n                at_mut[T](&mut v^.right, idx - length(&v^.left) - 1)\n            )\n        )\n    )\n);\nconst set_at = [T] (v :: Treap.t[T], idx :: Int32, value :: T) -> Treap.t[T] => (\n    let { left, v } = split_at(v, idx);\n    let { _, right } = split_at(v, 1);\n    join(left, join(singleton(value), right))\n);\nconst update_at = [T] (a :: Treap.t[T], idx :: Int32, f :: &T -> T) -> Treap.t[T] => (\n    set_at(a, idx, f(at(&a, idx)))\n);\nconst to_string = [T] (v :: &Treap.t[T], t_to_string :: &T -> String) -> String => (\n    let mut result = \"[\";\n    let mut i :: Int32 = 0;\n    for x in iter(v) do (\n        if i != 0 then (\n            result += \", \";\n        );\n        result += t_to_string(x);\n        i += 1;\n    );\n    result += \"]\";\n    result\n);\nconst iter = [T] (v :: &Treap.t[T]) -> std.iter.Iterable[type (&T)] => {\n    .iter = f => (\n        match v^ with (\n            | :Empty => ()\n            | :Node ref data => (\n                (iter[T](&data^.left)).iter(f);\n                f(&data^.value);\n                (iter[T](&data^.right)).iter(f);\n            )\n        )\n    )\n};\nconst iter_mut = [T] (v :: &mut Treap.t[T]) -> std.iter.Iterable[type (&mut T)] => {\n    .iter = f => (\n        match v^ with (\n            | :Empty => ()\n            | :Node ref mut data => (\n                (iter_mut[T](&mut data^.left)).iter(f);\n                f(&mut data^.value);\n                (iter_mut[T](&mut data^.right)).iter(f);\n            )\n        )\n    ),\n};\n","module:\n\nconst GenRange = [Self] newtype {\n    .gen :: (.min :: Self, .max :: Self) -> Self,\n};\n\nconst gen_range = [T] (.min :: T, .max :: T) with rng -> T => (\n    (T as GenRange).gen(.min, .max)\n);\n\nimpl Int32 as GenRange = {\n    .gen = (.min, .max) => @cfg (\n        | target.name == \"interpreter\" => (@native \"random.gen_range\")(.min, .max)\n        | target.name == \"javascript\" => (@native \"(ctx,x)=>Math.floor(x)\")((@native \"Math.random()\") * (max - min + 1)) + min\n    ),\n};\n\nimpl Int64 as GenRange = {\n    .gen = (.min, .max) => @cfg (\n        | target.name == \"interpreter\" => (@native \"random.gen_range\")(.min, .max)\n        | target.name == \"javascript\" => (@native \"(ctx,x)=>Math.floor(x)\")((@native \"Math.random()\") * (max - min + 1)) + min\n    ),\n};\n\nimpl Float64 as GenRange = {\n    .gen = (.min, .max) => @cfg (\n        | target.name == \"interpreter\" => (@native \"random.gen_range\")(.min, .max)\n        | target.name == \"javascript\" => (@native \"Math.random()\") * (max - min) + min\n    ),\n};\n","module:\nconst less = [T] (a :: T, b :: T) -> Bool => (\n    @cfg (\n        | (@native \"==\")(target.name, \"interpreter\") => (@native \"<\")(a, b)\n        | (@native \"==\")(target.name, \"ocaml\") => @native \"({a} < {b})\"\n        | (@native \"==\")(target.name, \"javascript\") => (@native \"Kast.cmp.less\")(a, b)\n    )\n);\nconst less_or_equal = [T] (a :: T, b :: T) -> Bool => (\n    @cfg (\n        | (@native \"==\")(target.name, \"interpreter\") => (@native \"<=\")(a, b)\n        | (@native \"==\")(target.name, \"ocaml\") => @native \"({a} <= {b})\"\n        | (@native \"==\")(target.name, \"javascript\") => (@native \"Kast.cmp.less_or_equal\")(a, b)\n    )\n);\nconst equal = [T] (a :: T, b :: T) -> Bool => (\n    @cfg (\n        | (@native \"==\")(target.name, \"interpreter\") => (@native \"==\")(a, b)\n        | (@native \"==\")(target.name, \"ocaml\") => @native \"({a} = {b})\"\n        | (@native \"==\")(target.name, \"javascript\") => (@native \"Kast.cmp.equal\")(a, b)\n    )\n);\nconst not_equal = [T] (a :: T, b :: T) -> Bool => (\n    @cfg (\n        | (@native \"==\")(target.name, \"interpreter\") => (@native \"!=\")(a, b)\n        | (@native \"==\")(target.name, \"ocaml\") => @native \"({a} <> {b})\"\n        | (@native \"==\")(target.name, \"javascript\") => (@native \"Kast.cmp.not_equal\")(a, b)\n    )\n);\nconst greater_or_equal = [T] (a :: T, b :: T) -> Bool => (\n    @cfg (\n        | (@native \"==\")(target.name, \"interpreter\") => (@native \">=\")(a, b)\n        | (@native \"==\")(target.name, \"ocaml\") => @native \"({a} >= {b})\"\n        | (@native \"==\")(target.name, \"javascript\") => (@native \"Kast.cmp.greater_or_equal\")(a, b)\n    )\n);\nconst greater = [T] (a :: T, b :: T) -> Bool => (\n    @cfg (\n        | (@native \"==\")(target.name, \"interpreter\") => (@native \">\")(a, b)\n        | (@native \"==\")(target.name, \"ocaml\") => @native \"({a} > {b})\"\n        | (@native \"==\")(target.name, \"javascript\") => (@native \"Kast.cmp.greater\")(a, b)\n    )\n);\n","module:\nconst std = @current_scope;\ninclude \"./syntax.ks\";\n\nconst Type = @native \"Type\";\n\nconst UnwindToken = [T :: Type] ((@native \"UnwindToken\")(T) :: Type);\nconst UnwindUnit = UnwindToken[type ()];\nconst LoopBlock = @context UnwindUnit;\nconst LoopBody = @context UnwindUnit;\n# const ReturnBlock = @context newtype (\n#     .T :: Type,\n#     .token :: Any,\n# );\nconst Bool :: Type = @native \"Bool\";\nconst Int32 :: Type = @native \"Int32\";\nconst UInt32 = Int32;\nconst Int64 :: Type = @native \"Int64\";\nconst Float64 :: Type = @native \"Float64\";\nconst Char :: Type = @native \"Char\";\nconst String :: Type = @native \"String\";\n\ninclude \"./ast.ks\";\n\nconst cmp = include \"./cmp.ks\";\nconst op = include \"./op.ks\";\n\ninclude \"./char.ks\";\ninclude \"./string.ks\";\n\nconst reflection = include \"./reflection.ks\";\nconst range = include \"./range.ks\";\nconst iter = include \"./iter.ks\";\nconst Option = include \"./option.ks\";\nconst dbg = include \"./dbg.ks\";\nconst convert = include \"./convert.ks\";\nconst io = include \"./io.ks\";\nconst path = include \"./path.ks\";\nconst fs = include \"./fs.ks\";\nconst net = include \"./net.ks\";\nconst sys = include \"./sys.ks\";\nconst random = include \"./random.ks\";\nconst collections = include \"./collections/_mod.ks\";\n\nconst panic = [T] (s :: String) -> T => @cfg (\n    | target.name == \"interpreter\" => (@native \"panic\")(s)\n    | target.name == \"javascript\" => (@native \"Kast.panic\")(s)\n);\nconst type_of_value = [T] (x :: T) -> Type => T;\n\nconst prelude = include \"./prelude.ks\";\n","module:\n\nconst t = [T] newtype {\n    .inner :: Treap.t[T]\n};\nconst new = [T] () -> ArrayList.t[T] => {\n    .inner = Treap.new[T]()\n};\nconst push_back = [T] (a :: &mut ArrayList.t[T], value :: T) => (\n    a^.inner = Treap.join(a^.inner, Treap.singleton(value));\n);\nconst iter = [T] (a :: &ArrayList.t[T]) -> std.iter.Iterable[type (&T)] => (\n    Treap.iter(&a^.inner)\n);\nconst iter_mut = [T] (a :: &mut ArrayList.t[T]) -> std.iter.Iterable[type (&mut T)] => (\n    Treap.iter_mut(&mut a^.inner)\n);\nconst at = [T] (a :: &ArrayList.t[T], idx :: Int32) -> &T => (\n    Treap.at(&a^.inner, idx)\n);\nconst at_mut = [T] (a :: &mut ArrayList.t[T], idx :: Int32) -> &mut T => (\n    Treap.at_mut(&mut a^.inner, idx)\n);\nconst length = [T] (q :: &ArrayList.t[T]) -> Int32 => (\n    Treap.length(&q^.inner)\n);\nconst to_string = [T] (a :: &ArrayList.t[T], f :: &T -> String) -> String => (\n    Treap.to_string(&a^.inner, f)\n);\n","module:\n\nconst KV = [K, V] newtype {\n    .key :: K,\n    .value :: V,\n};\nconst t = [K, V] newtype {\n    .inner :: Treap.t[KV[K, V]],\n};\nconst new = [K, V] () -> OrdMap.t[K, V] => {\n    .inner = Treap.new()\n};\n\nconst add = [K, V] (map :: &mut OrdMap.t[K, V], key :: K, value :: V) => (\n    get_or_init(map, key, () => value);\n);\n\nconst get = [K, V] (map :: &OrdMap.t[K, V], key :: K) -> Option.t[type (&V)] => (\n    let { less, greater_or_equal } = Treap.split(\n        map^.inner,\n        data => (\n            if data^.value.key < key then (\n                :LeftSubtree\n            ) else (\n                :RightSubtree\n            )\n        ),\n    );\n    let { equal, greater } = Treap.split(\n        greater_or_equal,\n        data => (\n            if data^.value.key <= key then (\n                :LeftSubtree\n            ) else (\n                :RightSubtree\n            )\n        ),\n    );\n    if Treap.length(&equal) == 0 then (\n        :None\n    ) else (\n        :Some &(Treap.at(&equal, 0))^.value\n    )\n);\n\nconst get_or_init = [K, V] (\n    map :: &mut OrdMap.t[K, V],\n    key :: K,\n    init :: () -> V,\n) -> &mut V => (\n    let { less, greater_or_equal } = Treap.split(\n        map^.inner,\n        data => (\n            if data^.value.key < key then (\n                :LeftSubtree\n            ) else (\n                :RightSubtree\n            )\n        ),\n    );\n    let { mut equal, greater } = Treap.split(\n        greater_or_equal,\n        data => (\n            if data^.value.key <= key then (\n                :LeftSubtree\n            ) else (\n                :RightSubtree\n            )\n        ),\n    );\n    if Treap.length(&equal) == 0 then (\n        equal = Treap.singleton({ .key, .value = init() });\n    );\n    map^.inner = Treap.join(less, Treap.join(equal, greater));\n    &mut (Treap.at_mut(&mut equal, 0))^.value\n);\n\nconst iter = [K, V] (map :: &OrdMap.t[K, V]) -> std.iter.Iterable[type (&KV[K, V])] => (\n    Treap.iter(&map^.inner)\n);\n","module:\n\nconst Path = String;\n\nconst join_path = (a :: Path, b :: Path) -> Path => (\n    a + \"/\" + b\n);\n\nconst Load = [Self] newtype {\n    .load :: Path -> Self,\n    .default_ext :: Option.t[String],\n};\n\nconst derive_Load = (ty :: Type) -> std.Ast => @cfg (\n    | target.name == \"interpreter\" => match std.reflection.type_info(ty) with (\n        | :Tuple { .unnamed, .named } => (\n            match unnamed with (\n                | :Nil => ()\n                | :Cons _ => panic(\"Expected zero unnamed fields\")\n            );\n            let mut load_fields = ArrayList.new();\n            let path = `(path);\n            let load_fields = std.collections.SList.iter[type { String, Type }](&named)\n                |> std.iter.map(&{ name, field_ty } => (\n                    let name_ident = std.Ast.ident(name);\n                    `(\n                        .$name_ident = (\n                            let mut field_filename = name;\n                            if (field_ty as Load).default_ext is :Some ext then (\n                                field_filename = field_filename + \".\" + ext;\n                            );\n                            let field_path = join_path($path, field_filename);\n                            (field_ty as Load).load(field_path)\n                        )\n                    )\n                ))\n                |> std.iter.reduce((a, b) => `($a, $b))\n                |> Option.unwrap_or(`());\n            `(\n                impl ty as Load = {\n                    .load = $path => {\n                        $load_fields\n                    },\n                    .default_ext = :None,\n                };\n            )\n        )\n        | _ => panic(\"Can't derive Load\")\n    )\n    | true => panic(\"Only usable at comptime\")\n);","const asset = import \"./asset.ks\";\n\nmodule:\n\nconst ContextT = @opaque_type;\n\nconst Context = @context ContextT;\n\nconst init = () -> ContextT => (\n    (@native \"Runtime.audio.init\")()\n);\n\nconst load = (path) -> Buffer => (\n    let ctx = (@current Context);\n    (@native \"Runtime.audio.load\")(.ctx, .path)\n);\n\nconst PlayOptions = newtype {\n    .@\"loop\" :: Bool,\n    .gain :: Float64,\n};\n\nimpl PlayOptions as module = (\n    module:\n    \n    const default = () -> PlayOptions => {\n        .@\"loop\" = false,\n        .gain = 1,\n    };\n);\n\nconst play_with = (buffer :: Buffer, options :: PlayOptions) -> () => (\n    let ctx = (@current Context);\n    (@native \"Runtime.audio.play\")(.ctx, .buffer, .options)\n);\n\nconst play = (buffer :: Buffer) => (\n    play_with(buffer, PlayOptions.default())\n);\n\nconst set_master_volume = (volume :: Float64) -> () => (\n    let ctx = (@current Context);\n    (@native \"Runtime.audio.set_master_volume\")(.ctx, .volume)\n);\n\nconst Buffer = @opaque_type;\n\nimpl Buffer as asset.Load = {\n    .load,\n    .default_ext = :Some \"wav\",\n};","impl String as module = (\n    module:\n    const length = (s :: String) -> Int32 => @cfg (\n        | target.name == \"interpreter\" => (@native \"string.length\")(s)\n        | target.name == \"javascript\" => (@native \"Kast.String.length\")(s)\n    );\n    const at = (s :: String, idx :: Int32) -> Char => @cfg (\n        | target.name == \"interpreter\" => (@native \"string.at\")(s, idx)\n        | target.name == \"javascript\" => (@native \"Kast.String.at\")(s, idx)\n    );\n    const substring = (s :: String, start :: Int32, len :: Int32) -> String => @cfg (\n        | target.name == \"interpreter\" => (@native \"string.substring\")(s, start, len)\n        | target.name == \"javascript\" => (@native \"Kast.String.substring\")(s, start, len)\n    );\n    const iter = (s :: String) -> std.iter.Iterable[Char] => @cfg (\n        | target.name == \"interpreter\" => {\n            .iter = f => (@native \"string.iter\")(s, f)\n        }\n        | target.name == \"javascript\" => {\n            .iter = f => (@native \"Kast.String.iter\")(s, f)\n        }\n    );\n    const iteri = (s :: String) -> std.iter.Iterable[type { Int32, Char }] => @cfg (\n        | target.name == \"interpreter\" => {\n            .iter = f => (@native \"string.iteri\")(s, (i, c) => f({ i, c }))\n        }\n        | target.name == \"javascript\" => {\n            .iter = f => (@native \"Kast.String.iteri\")(s, f)\n        }\n    );\n    const index_of = (c :: Char, s :: String) -> Int32 => with_return (\n        for { i, c_at_i } in iteri(s) do (\n            if c == c_at_i then (\n                return i;\n            );\n        );\n        -1\n    );\n    const last_index_of = (c :: Char, s :: String) -> Int32 => (\n        let mut result = -1;\n        for { i, c_at_i } in iteri(s) do (\n            if c == c_at_i then (\n                result = i;\n            );\n        );\n        result\n    );\n    const split = (s :: String, sep :: Char) -> std.iter.Iterable[String] => {\n        .iter = f => (\n            let mut start = 0;\n            let perform_split = i => (\n                let part = substring(s, start, i - start);\n                f(part);\n                start = i + 1;\n            );\n            for { i, c } in iteri(s) do (\n                if c == sep then (\n                    perform_split(i);\n                );\n            );\n            perform_split(length(s));\n        )\n    };\n    const lines = s => split(s, '\\n');\n    const split_once = (s :: String, sep :: Char) -> { String, String } => with_return (\n        for { i, c } in iteri(s) do (\n            if c == sep then (\n                return {\n                    substring(s, 0, i),\n                    substring(s, i + 1, length(s) - i - 1),\n                }\n            );\n        );\n        panic(\"split_once separator not found\")\n    );\n    const trim_matches = (s :: String, f :: Char -> Bool) -> String => (\n        let len = length(s);\n        let mut start = 0;\n        while start < len and at(s, start) |> f do (\n            start += 1;\n        );\n        let mut end = len;\n        while end > start and at(s, end - 1) |> f do (\n            end -= 1;\n        );\n        substring(s, start, end - start)\n    );\n    const trim = s => trim_matches(s, Char.is_whitespace);\n    \n    # replace all occurences of a string by a new string\n    const replace_all_owned = (s :: String, .old :: String, .new :: String) => with_return (\n        # an empty `old` means we cannot replace\n        if length(old) == 0 then return s;\n        # an empty `s` means we cannot replace\n        if length(s) == 0 then return s;\n        # `s` smaller than `old` means we cannot replace\n        if length(s) < length(old) then return s;\n        if length(s) == length(old) then return (\n            if s == old then (\n                # `s` == `old` means replaced is just `new`\n                new\n            ) else (\n                # `s` equal to `old` in size but not contents means we cannot replace\n                s\n            )\n        );\n        \n        let end = (length(s) - length(old) + 1);\n        let mut start :: Int32 = 0;\n        while start < end and substring(s, start, length(old)) != old do (\n            start += 1\n        );\n        \n        if start == end then (\n            # `old` not found in `s`\n            s\n        ) else (\n            # `old` found in `s`, replace with `new` and continue searching in remaining portion of `s`\n            let rest = substring(\n                s,\n                start + length(old),\n                length(s) - start - length(old)\n            );\n            let replaced_rest = replace_all_owned(rest, .old, .new);\n            \n            substring(s, 0, start)\n            + new\n            + replaced_rest\n        )\n    );\n    \n    # find if string contains another string\n    const contains = (s :: String, search :: String) -> Bool => with_return (\n        # an empty `search` is not contained\n        if length(search) == 0 then return false;\n        # an empty `s` contains nothing\n        if length(s) == 0 then return false;\n        # `s` smaller than `search` means it cannot be contained\n        if length(s) < length(search) then return false;\n        if length(s) == length(search) then return (\n            if s == search then (\n                # `s` == `search` means `s` contains `search`\n                true\n            ) else (\n                # `s` equal to `search` in size but not contents means `s` does not contains `search`\n                false\n            )\n        );\n        \n        let end = (length(s) - length(search) + 1);\n        let mut start :: Int32 = 0;\n        while start < end and substring(s, start, length(search)) != search do (\n            start += 1\n        );\n        \n        # if loop ended before end, `s` contains `search`\n        start != end\n    );\n    \n    const find_match = (\n        s :: String, f :: Char -> Bool\n    ) -> std.Option.t[type { Int32, Char }] => with_return (\n        iteri(s).iter({ idx, c } => if f(c) then return :Some { idx, c });\n        :None\n    );\n    \n    const to_lowercase = (s :: String) -> String => (\n        let next_alphabet = find_match(s, Char.is_uppercase);\n        match next_alphabet with (\n            | :Some { i, c } => (\n                substring(s, 0, i)\n                + to_string(Char.to_lowercase(c))\n                + to_lowercase(substring(s, i + 1, length(s) - i - 1))\n            )\n            | :None => s\n        )\n    );\n    \n    const to_uppercase = (s :: String) -> String => (\n        let next_alphabet = find_match(s, Char.is_lowercase);\n        match next_alphabet with (\n            | :Some { i, c } => (\n                substring(s, 0, i)\n                + to_string(Char.to_uppercase(c))\n                + to_uppercase(substring(s, i + 1, length(s) - i - 1))\n            )\n            | :None => s\n        )\n    );\n    \n    const FromString = [Self] newtype {\n        .from_string :: String -> Self\n    };\n    \n    impl Int32 as FromString = {\n        .from_string = s => @cfg (\n            | target.name == \"interpreter\" => (@native \"parse\")(s)\n            | target.name == \"ocaml\" => @native \"@natives.todo()\"\n            | target.name == \"javascript\" => (@native \"Kast.parse.Int32\")(s)\n        )\n    };\n    impl Int64 as FromString = {\n        .from_string = s => @cfg (\n            | target.name == \"interpreter\" => (@native \"parse\")(s)\n            | target.name == \"ocaml\" => @native \"@natives.todo()\"\n            | target.name == \"javascript\" => (@native \"Kast.parse.Int64\")(s)\n        )\n    };\n    impl Float64 as FromString = {\n        .from_string = s => @cfg (\n            | target.name == \"interpreter\" => (@native \"parse\")(s)\n            | target.name == \"ocaml\" => @native \"@natives.todo()\"\n            | target.name == \"javascript\" => (@native \"Kast.parse.Float64\")(s)\n        )\n    };\n    impl Bool as FromString = {\n        .from_string = s => if s == \"true\" then (\n            true\n        ) else if s == \"false\" then (\n            false\n        ) else (\n            panic(\"cannot parse '\" + s + \"' as bool\")\n        )\n    };\n    \n    const ToString = [Self] newtype {\n        .to_string :: Self -> String\n    };\n    \n    impl Char as ToString = {\n        .to_string = c => @cfg (\n            | target.name == \"interpreter\" => (@native \"to_string\")(c)\n            | target.name == \"javascript\" => (@native \"Kast.String.to_string\")(c)\n        )\n    };\n    impl Int32 as ToString = {\n        .to_string = num => @cfg (\n            | target.name == \"interpreter\" => (@native \"to_string\")(num)\n            | target.name == \"ocaml\" => @native \"@natives.todo()\"\n            | target.name == \"javascript\" => (@native \"Kast.String.to_string\")(num)\n        )\n    };\n    impl Int64 as ToString = {\n        .to_string = num => @cfg (\n            | target.name == \"interpreter\" => (@native \"to_string\")(num)\n            | target.name == \"ocaml\" => @native \"@natives.todo()\"\n            | target.name == \"javascript\" => (@native \"Kast.String.to_string\")(num)\n        )\n    };\n    impl Float64 as ToString = {\n        .to_string = num => @cfg (\n            | target.name == \"interpreter\" => (@native \"to_string\")(num)\n            | target.name == \"ocaml\" => @native \"@natives.todo()\"\n            | target.name == \"javascript\" => (@native \"Kast.String.to_string\")(num)\n        )\n    };\n    impl Bool as ToString = {\n        .to_string = b => if b then \"true\" else \"false\"\n    };\n    \n    const parse = [T] (s :: String) -> T => (\n        (T as FromString).from_string(s)\n    );\n    const to_string = [T] (value :: T) -> String => (\n        (T as ToString).to_string(value)\n    );\n);\n","module:\n\nconst Into = [T] [Self] newtype {\n    .into :: Self -> T\n};\nimpl Int32 as Into[Int64] = {\n    .into = value => (\n        value |> String.to_string[_] |> String.parse[_]\n    )\n};\nimpl Int64 as Into[Int32] = {\n    .into = value => (\n        value |> String.to_string[_] |> String.parse[_]\n    )\n};\n","module:\n\nuse (import \"./la.ks\").*;\nconst js = import \"./js.ks\";\nconst web = import \"./web.ks\";\n\nconst fetch_string = (path :: String) -> String => (\n    (@native \"Runtime.fetch_string\")(path)\n);\n\nconst time = (\n    module:\n    \n    const now = () -> Float64 => (\n        (@native \"performance.now()\") / 1000\n    );\n);\n\nconst load_image = (url :: String) -> web.HtmlImageElement => (\n    (@native \"Runtime.load_image\")(url)\n);\n\nconst await_animation_frame = () -> () => (\n    (@native \"Runtime.await_animation_frame\")()\n);\n\nconst abs = (x :: Float32) -> Float32 => (\n    if x < 0 then (\n        -x\n    ) else (\n        x\n    )\n);\n\nconst min = (a :: Float32, b :: Float32) -> Float32 => (\n    if a < b then a else b\n);\n\nconst max = (a :: Float32, b :: Float32) -> Float32 => (\n    if a > b then a else b\n);\n\nconst clamp = (x :: Float32, .min :: Float32, .max :: Float32) -> Float32 => (\n    if x < min then min else if x > max then max else x\n);\n","use (import \"../common.ks\").*;\nconst gl = import \"../gl/gl.ks\";\nconst ugli = import \"../ugli.ks\";\n\nmodule:\n\nconst asset = import \"./asset.ks\";\nconst audio = import \"./audio.ks\";\nconst input = import \"./input.ks\";\n\nconst Vertex = newtype {\n    .a_pos :: Vec2,\n    .a_uv :: Vec2,\n};\n\ninclude_ast ugli.Vertex_derive(Vertex);\n\nconst ContextT = newtype {\n    .canvas :: web.HtmlCanvasElement,\n    .canvas_size :: {\n        .width :: Float32,\n        .height :: Float32,\n    },\n    .quad :: {\n        .program :: ugli.Program,\n        .buffer :: ugli.VertexBuffer.t[Vertex],\n    },\n};\nconst Context = @context ContextT;\n\nconst init = () -> { .geng :: ContextT, .gl :: gl.ContextT } => (\n    @native (\n        \"(()=>{\"\n        + std.fs.read_file(\n            std.path.dirname(__FILE__) + \"/runtime.js\"\n        )\n        + \"})()\"\n    );\n    \n    let document = web.document();\n    let canvas :: web.HtmlCanvasElement = document\n        |> web.HtmlDocumentElement.get_element_by_id(\"canvas\")\n        |> js.unsafe_cast;\n    let webgl :: web.WebGLRenderingContext = canvas\n        |> web.HtmlCanvasElement.get_context(\"webgl\")\n        |> js.from_any;\n    with gl.Context = webgl;\n    let quad = {\n        .program = (\n            let vertex_shader = ugli.compile_shader(\n                gl.VERTEX_SHADER,\n                fetch_string(\"assets/shaders/quad/vertex.glsl\")\n            );\n            let fragment_shader = ugli.compile_shader(\n                gl.FRAGMENT_SHADER,\n                fetch_string(\"assets/shaders/quad/fragment.glsl\")\n            );\n            ugli.Program.init(vertex_shader, fragment_shader)\n        ),\n        .buffer = (\n            let mut data :: ArrayList.t[Vertex] = ArrayList.new();\n            ArrayList.push_back(\n                &mut data,\n                {\n                    .a_pos = { -1, -1 },\n                    .a_uv = { 0, 0 },\n                },\n            );\n            ArrayList.push_back(\n                &mut data,\n                {\n                    .a_pos = { +1, -1 },\n                    .a_uv = { 1, 0 },\n                },\n            );\n            ArrayList.push_back(\n                &mut data,\n                {\n                    .a_pos = { +1, +1 },\n                    .a_uv = { 1, 1 },\n                },\n            );\n            ArrayList.push_back(\n                &mut data,\n                {\n                    .a_pos = { -1, +1 },\n                    .a_uv = { 0, 1 },\n                },\n            );\n            ugli.VertexBuffer.init(&data)\n        ),\n    };\n    let mut geng = {\n        .canvas,\n        .canvas_size = { .width = 1, .height = 1 },\n        .quad,\n    };\n    (@native \"Runtime.observe_canvas_size\")(\n        .canvas,\n        .webgl,\n        .handler = size => (\n            geng.canvas_size = size;\n        ),\n    );\n    {\n        .geng,\n        .gl = webgl,\n    }\n);\n\nconst canvas_size = () => (\n    (@current Context).canvas_size\n);\n\nconst Camera = newtype {\n    .pos :: Vec2,\n    .fov :: Float32,\n};\n\nconst CameraUniforms = newtype {\n    .view_matrix :: Mat3,\n    .projection_matrix :: Mat3,\n};\n\nconst CameraCtx = @context CameraUniforms;\n\nimpl CameraUniforms as module = (\n    module:\n    \n    const init = (\n        camera :: Camera,\n        .framebuffer_size :: Vec2,\n    ) -> CameraUniforms => (\n        let view_matrix = {\n            { 1, 0, -camera.pos.0 },\n            { 0, 1, -camera.pos.1 },\n            { 0, 0, 1 },\n        };\n        let aspect = framebuffer_size.0 / framebuffer_size.1;\n        let projection_matrix = {\n            { 2 / aspect / camera.fov, 0, 0 },\n            { 0, 2 / camera.fov, 0 },\n            { 0, 0, 1 },\n        };\n        {\n            .view_matrix,\n            .projection_matrix,\n        }\n    );\n);\n\nimpl Camera as module = (\n    module:\n    \n    const screen_to_world = (\n        camera :: Camera,\n        screen_pos :: Vec2,\n        .framebuffer_size :: Vec2,\n    ) -> Vec2 => (\n        let uniforms = CameraUniforms.init(camera, .framebuffer_size);\n        let gl_screen_pos = Vec2.map(\n            Vec2.vdiv(screen_pos, framebuffer_size),\n            x => x * 2 - 1,\n        );\n        # projection_matrix * view_matrix * world_pos = gl_screen_pos\n        let world_pos = Mat3.mul_vec(\n            Mat3.inverse(\n                Mat3.mul_mat(\n                    uniforms.projection_matrix,\n                    uniforms.view_matrix,\n                )\n            ),\n            { gl_screen_pos.0, gl_screen_pos.1, 1 },\n        );\n        { world_pos.0, world_pos.1 }\n    );\n);\n\nconst draw_quad = (\n    .pos :: Vec2,\n    .half_size :: Vec2,\n    .texture :: ugli.Texture,\n) => (\n    let ctx = (@current Context);\n    let camera = (@current CameraCtx);\n    let program = ctx.quad.program;\n    program |> ugli.Program.@\"use\";\n    \n    let mut draw_state = ugli.DrawState.init();\n    let draw_state = &mut draw_state;\n    \n    program |> ugli.set_uniform(\"u_pos\", pos, draw_state);\n    program |> ugli.set_uniform(\"u_half_size\", half_size, draw_state);\n    program |> ugli.set_uniform(\"u_view_matrix\", camera.view_matrix, draw_state);\n    program |> ugli.set_uniform(\"u_projection_matrix\", camera.projection_matrix, draw_state);\n    program |> ugli.set_uniform(\"u_texture\", texture, draw_state);\n    program |> ugli.set_vertex_data_source(ctx.quad.buffer);\n    gl.draw_arrays(gl.TRIANGLE_FAN, 0, 4);\n);\n\nconst await_next_frame = () -> () => (\n    await_animation_frame();\n);\n\nconst load_texture = (path :: String, filter :: ugli.Filter) -> ugli.Texture => (\n    ugli.Texture.init(load_image(path), filter)\n);\n\nconst load_shader = (path :: String) -> ugli.Program => (\n    let vertex_shader = ugli.compile_shader(\n        gl.VERTEX_SHADER,\n        fetch_string(path + \"/vertex.glsl\")\n    );\n    let fragment_shader = ugli.compile_shader(\n        gl.FRAGMENT_SHADER,\n        fetch_string(path + \"/fragment.glsl\")\n    );\n    ugli.Program.init(vertex_shader, fragment_shader)\n);\n\nconst is_fullscreen = () -> Bool => (\n    (@native \"Runtime.is_fullscreen\")()\n);\n\nconst set_fullscreen = (full :: Bool) -> () => (\n    let ctx = (@current Context);\n    (@native \"Runtime.set_fullscreen\")(.canvas = ctx.canvas, .full)\n);\n\nconst toggle_fullscreen = () => (\n    set_fullscreen(not is_fullscreen());\n);\n","module:\n\nconst t = [T] newtype (\n    | :Some T\n    | :None\n);\nconst Option = t;\n\nconst is_some = [T] (opt :: &Option[T]) -> Bool => match opt^ with (\n    | :Some _ => true\n    | :None => false\n);\n\nconst is_none = [T] (opt :: &Option[T]) -> Bool => match opt^ with (\n    | :Some _ => false\n    | :None => true\n);\n\nconst map = [T, U] (opt :: Option[T], f :: T -> U) -> Option[U] => match opt with (\n    | :Some x => :Some f(x)\n    | :None => :None\n);\n\nconst and_then = [T, U] (opt :: Option[T], f :: T -> Option[U]) -> Option[U] => match opt with (\n    | :Some x => f(x)\n    | :None => :None\n);\n\nconst as_ref = [T] (opt :: &Option[T]) -> Option[type (&T)] => match opt^ with (\n    | :Some ref x => :Some x\n    | :None => :None\n);\n\nconst as_deref = [T] (opt :: Option[type (&T)]) -> Option[T] => match opt with (\n    | :None => :None\n    | :Some x => :Some x^\n);\n\nconst unwrap = [T] (opt :: Option[T]) -> T => match opt with (\n    | :Some x => x\n    | :None => panic(\"unwrapped :None\")\n);\n\nconst unwrap_or_else = [T] (opt :: Option[T], default :: () -> T) -> T => (\n    match opt with (\n        | :Some x => x\n        | :None => default()\n    )\n);\n\nconst unwrap_or = [T] (opt :: Option[T], default :: T) -> T => (\n    match opt with (\n        | :Some x => x\n        | :None => default\n    )\n);\n\n","use (import \"./la.ks\").*;\nconst js = import \"./js.ks\";\n\n@syntax \"js_call\" 30 @wrap never = \"@js_call\" \" \" js _=(@wrap if_any \"(\" \"\"/\"\\n\\t\" args:any \"\"/\"\\\\\\n\" \")\");\nimpl syntax (@js_call js(args)) = `(\n    (@native (\"async(ctx,...args)=>{return await(\" + $js + \")(...args)}\"))($args)\n);\n@syntax \"js_call_method\" 30 @wrap never = \"@js_call\" \" \" obj \".\" js _=(@wrap if_any \"(\" \"\"/\"\\n\\t\" args:any \"\"/\"\\\\\\n\" \")\");\nimpl syntax (@js_call obj.js(args)) = `(\n    (@native (\"async(ctx,o,...args)=>{return await o.\" + $js + \"(...args)}\"))($obj, ...{ $args })\n);\n\nmodule:\n\nconst HtmlElement = @opaque_type;\n\nconst HtmlCanvasElement = @opaque_type;\n\nimpl HtmlCanvasElement as module = (\n    module:\n    \n    const get_context = (\n        canvas :: HtmlCanvasElement,\n        context_type :: String,\n    ) -> js.Any => (\n        @js_call canvas.\"getContext\"(context_type)\n    );\n    \n    const set_width = (\n        canvas :: HtmlCanvasElement,\n        width :: Int32,\n    ) -> () => (\n        @js_call \"({canvas,width})=>{canvas.width=width}\"(\n            { .canvas, .width }\n        )\n    );\n    \n    const set_height = (\n        canvas :: HtmlCanvasElement,\n        height :: Int32,\n    ) -> () => (\n        @js_call \"({canvas,height})=>{canvas.height=height}\"(\n            { .canvas, .height }\n        )\n    );\n);\n\nconst HtmlDocumentElement = @opaque_type;\n\nimpl HtmlDocumentElement as module = (\n    module:\n    \n    const get_element_by_id = (\n        document :: HtmlDocumentElement,\n        id :: String,\n    ) -> HtmlElement => (\n        @js_call document.\"getElementById\"(id)\n    );\n);\n\nconst document = () -> HtmlDocumentElement => (\n    @native \"document\"\n);\n\nconst WebGLRenderingContext = @opaque_type;\n\nconst HtmlImageElement = newtype {\n    .naturalWidth :: Float32,\n    .naturalHeight :: Float32,\n};\n","module:\nconst t = [T] newtype {\n    .inner :: Treap.t[T]\n};\n\nconst new = [T] () -> Queue.t[T] => {\n    .inner = Treap.new()\n};\nconst push = [T] (q :: &mut Queue.t[T], value :: T) => (\n    q^.inner = Treap.join(q^.inner, Treap.singleton(value));\n);\nconst pop = [T] (q :: &mut Queue.t[T]) -> T => (\n    let { first, rest } = Treap.split_at(q^.inner, 1);\n    q^.inner = rest;\n    (Treap.at(&first, 0))^\n);\nconst front = [T] (q :: &Queue.t[T]) -> &T => (\n    Treap.at(&q^.inner, 0)\n);\nconst length = [T] (q :: &Queue.t[T]) -> Int32 => (\n    Treap.length(&q^.inner)\n);\n","use (import \"../common.ks\").*;\n\nuse std.collections.Queue;\n\nmodule:\n\nconst raw = (\n    module:\n    \n    const MouseEvent = newtype {\n        .button :: Int32,\n    };\n    \n    const PointerEvent = MouseEvent;\n);\n\nconst ContextT = newtype {\n    .runtime :: @opaque_type,\n    .events :: Queue.t[Event],\n};\nconst Context = @context ContextT;\n\nconst init = (canvas :: web.HtmlCanvasElement) -> ContextT => (\n    let mut events = Queue.new();\n    let runtime = (@native \"Runtime.input.init\")(\n        .canvas,\n        .mouse_press = (e :: raw.MouseEvent) => (\n            if MouseButton.from_raw(e.button) is :Some (button) then (\n                Queue.push(&mut events, :MousePress { .button });\n            );\n        ),\n        .pointer_press = (e :: raw.PointerEvent, pos :: Vec2) => (\n            Queue.push(&mut events, :PointerPress { .pos });\n        ),\n    );\n    {\n        .runtime,\n        .events,\n    }\n);\n\nconst Key = newtype (\n    | :ArrowLeft\n    | :ArrowRight\n    | :ArrowUp\n    | :ArrowDown\n    | :Space\n);\n\nimpl Key as module = (\n    module:\n    \n    const is_pressed = (key :: Key) -> Bool => (\n        (@native \"Runtime.input.is_key_pressed\")(key)\n    );\n);\n\nconst MouseButton = newtype (\n    | :Left\n    | :Middle\n    | :Right\n);\n\nimpl MouseButton as module = (\n    module:\n    \n    const from_raw = (raw :: Int32) -> Option.t[MouseButton] => (\n        if raw == 0 then (\n            :Some (:Left)\n        ) else if raw == 1 then (\n            :Some (:Middle)\n        ) else if raw == 2 then (\n            :Some (:Right)\n        ) else (\n            :None\n        )\n    );\n    \n    const into_raw = (button :: MouseButton) -> Int32 => (\n        match button with (\n            | :Left => 0\n            | :Middle => 1\n            | :Right => 2\n        )\n    );\n    \n    const is_pressed = (button :: MouseButton) -> Bool => (\n        (@native \"Runtime.input.is_mouse_button_pressed\")(\n            into_raw(button)\n        )\n    );\n);\n\nconst Event = newtype (\n    | :MousePress { .button :: MouseButton }\n    | :PointerPress { .pos :: Vec2 }\n);\n\nconst iter_events = () -> std.iter.Iterable[Event] => (\n    let mut ctx = (@current Context);\n    {\n        .iter = consumer => (\n            while Queue.length(&ctx.events) > 0 do (\n                let event = Queue.pop(&mut ctx.events);\n                consumer(event);\n            );\n        ),\n    }\n);\n\nconst is_any_pointer_pressed = () -> Bool => (\n    (@native \"Runtime.input.is_any_pointer_pressed\")()\n);\n","use std.collections.OrdMap;\nuse (import \"lib/_lib.ks\").*;\n\n# geng.init :: () with (Allocator, Async) -> () with (geng.Context, gl.Context);\n# geng.init :: [C] () -> () with C -> C | geng.Ctx | gl.Ctx\n# with ...geng.init();\nlet { .geng = geng_ctx, .gl = gl_ctx } = geng.init();\n\nwith geng.Context = geng_ctx;\nwith gl.Context = gl_ctx;\n\nwith geng.input.Context = geng.input.init(geng_ctx.canvas);\nwith geng.audio.Context = geng.audio.init();\n\nconst Assets = (\n    module:\n    \n    const t = newtype {\n        .music :: geng.audio.Buffer,\n        .sfx :: Sfx,\n        .font :: font.Font,\n        .shaders :: Shaders,\n        .textures :: Textures,\n    };\n    \n    const Shaders = newtype {\n        .background :: ugli.Program,\n    };\n    \n    const Sfx = newtype {\n        .jump :: geng.audio.Buffer,\n        .hit :: geng.audio.Buffer,\n        .pickup_star :: geng.audio.Buffer,\n    };\n    \n    const Textures = newtype {\n        .player :: ugli.Texture,\n        .enemy :: ugli.Texture,\n        .grass :: ugli.Texture,\n        .clouds :: ugli.Texture,\n        .play :: ugli.Texture,\n        .star :: ugli.Texture,\n        .fullscreen :: ugli.Texture,\n        .mute :: ugli.Texture,\n        .muted :: ugli.Texture,\n    };\n);\n\n# include_ast geng.asset.derive_Load(Assets.t);\n# include_ast geng.asset.derive_Load(Assets.Shaders);\n# include_ast geng.asset.derive_Load(Assets.Sfx);\n# include_ast geng.asset.derive_Load(Assets.Textures);\n\n# let assets = (Assets.t as geng.asset.Load).load(\"assets\");\n\nlet assets = (\n    module:\n    \n    let music = geng.audio.load(\"assets/music.wav\");\n    geng.audio.play_with(\n        music,\n        {\n            .@\"loop\" = true,\n            .gain = 2,\n        },\n    );\n    let sfx = {\n        .jump = geng.audio.load(\"assets/sfx/jump.wav\"),\n        .hit = geng.audio.load(\"assets/sfx/hit.wav\"),\n        .pickup_star = geng.audio.load(\"assets/sfx/pickup_star.wav\"),\n    };\n    let font = font.Font.load(\"assets/font\");\n    \n    let shaders = {\n        .background = geng.load_shader(\"assets/shaders/background\"),\n    };\n    \n    let load_texture = path => geng.load_texture(\"assets/textures/\" + path, :Nearest);\n    \n    let load_background_texture = path => (\n        let mut texture = load_texture(path);\n        &mut texture |> ugli.Texture.set_wrap_separate(:Repeat, :ClampToEdge);\n        texture\n    );\n    \n    let textures = {\n        .player = load_texture(\"unicorn.png\"),\n        .enemy = load_texture(\"angry.png\"),\n        .grass = load_background_texture(\"grass.png\"),\n        .clouds = load_background_texture(\"clouds.png\"),\n        .play = load_texture(\"play.png\"),\n        .star = load_texture(\"star.png\"),\n        .fullscreen = load_texture(\"fullscreen.png\"),\n        .mute = load_texture(\"mute.png\"),\n        .muted = load_texture(\"muted.png\"),\n    };\n);\n\nconst PLAYER_OFFSET = 2;\nconst BACKGROUND_COLOR = { 0, 0, 0.1, 1 };\nconst ENEMY_SPAWN_TIME = 1;\nconst ENEMY_SPEED = 0.3;\nconst SPAWN_DISTANCE = { .min = 3, .max = 7 };\nconst STAR_CHANCE = 0.5;\nconst PLAYER_SPEED = 3;\nconst PLAYER_MAX_VERTICAL_SPEED = 5;\nconst JUMP_SPEED = 10;\nconst PLAYER_ACCEL = 20;\nconst PLAYER_RADIUS = 0.3;\nconst ENEMY_RADIUS = 0.3;\nconst FOV = 5;\nconst GRAVITY = 10;\n\nconst GROUND = 0;\nconst MAX_HEIGHT = 3;\n\nconst Entity = newtype {\n    .pos :: Vec2,\n    .half_size :: Vec2,\n    .vel :: Vec2,\n    .texture :: ugli.Texture,\n    .on_ground :: Bool,\n};\n\nimpl Entity as module = (\n    module:\n    \n    const update = (entity :: &mut Entity, dt :: Float64) => (\n        entity^.pos = Vec2.add(entity^.pos, Vec2.mul(entity^.vel, dt));\n    );\n    \n    const draw = (entity :: &Entity) => (\n        geng.draw_quad(\n            .pos = entity^.pos,\n            .half_size = entity^.half_size,\n            .texture = entity^.texture,\n        );\n    );\n);\n\nlet check_collision = (a :: &Entity, b :: &Entity) -> Bool => (\n    abs(a^.pos.0 - b^.pos.0) < a^.half_size.0 + b^.half_size.0\n    and abs(a^.pos.1 - b^.pos.1) < a^.half_size.1 + b^.half_size.1\n);\n\nuse std.collections.Treap;\n\nconst QuadPos = newtype {\n    .pos :: Vec2,\n    .half_size :: Vec2,\n};\n\nconst ZERO_QUAD_POS :: QuadPos = {\n    .pos = { 0, 0 },\n    .half_size = { 0, 0 },\n};\n\nlet mut muted = false;\n\nconst State = newtype {\n    .player :: Option.t[Entity],\n    .enemies :: Treap.t[Entity],\n    .stars :: Treap.t[Entity],\n    .camera :: geng.Camera,\n    .next_spawn :: Float32,\n    .score :: Int32,\n    .play_button_pos :: QuadPos,\n    .fullscreen_button_pos :: QuadPos,\n    .mute_button_pos :: QuadPos,\n};\n\n# const StateCtx = @context State;\nimpl State as module = (\n    module:\n    \n    const init = () -> State => {\n        .player = :None,\n        .enemies = Treap.new(),\n        .camera = {\n            .pos = { 0, (GROUND + MAX_HEIGHT) / 2 },\n            .fov = FOV,\n        },\n        .stars = Treap.new(),\n        .next_spawn = 0,\n        .score = 0,\n        .play_button_pos = ZERO_QUAD_POS,\n        .fullscreen_button_pos = ZERO_QUAD_POS,\n        .mute_button_pos = ZERO_QUAD_POS,\n    };\n    \n    const restart = (state :: &mut State) => (\n        state^ = {\n            ...State.init(),\n            .player = :Some {\n                .pos = { 0, 0 },\n                .half_size = { PLAYER_RADIUS, PLAYER_RADIUS },\n                .vel = { 0, 0 },\n                .texture = assets.textures.player,\n                .on_ground = false,\n            },\n        };\n    );\n    \n    const spawn = (state :: &mut State) => (\n        let x = state^.camera.pos.0 + FOV;\n        let y = std.random.gen_range(\n            .min = GROUND + ENEMY_RADIUS,\n            .max = MAX_HEIGHT - ENEMY_RADIUS,\n        );\n        let is_enemy = std.random.gen_range[Float32](.min = 0, .max = 1) < STAR_CHANCE;\n        let texture = if is_enemy then (\n            assets.textures.enemy\n        ) else (\n            assets.textures.star\n        );\n        let entity = {\n            .pos = { x, y },\n            .half_size = { ENEMY_RADIUS, ENEMY_RADIUS },\n            .vel = { 0, 0 },\n            .texture,\n            .on_ground = true,\n        };\n        let collection = if is_enemy then (\n            &mut state^.enemies\n        ) else (\n            &mut state^.stars\n        );\n        collection^ = Treap.join(collection^, Treap.singleton(entity));\n    );\n    \n    const WhatIsClicked = newtype (\n        | :Play\n        | :Fullscreen\n        | :Mute\n    );\n    \n    const what_is_clicked = (\n        state :: &State,\n        screen_pos :: Vec2,\n    ) -> Option.t[WhatIsClicked] => with_return (\n        if state^.player is :Some (_) then return :None;\n        let framebuffer_size = {\n            geng_ctx.canvas_size.width,\n            geng_ctx.canvas_size.height,\n        };\n        let pos = geng.Camera.screen_to_world(\n            state^.camera,\n            screen_pos,\n            .framebuffer_size,\n        );\n        # dbg.print(.screen_pos, .pos);\n        let check = (where :: QuadPos, what :: WhatIsClicked) => (\n            if (\n                pos.0 >= where.pos.0 - where.half_size.0\n                and pos.1 >= where.pos.1 - where.half_size.1\n                and pos.0 <= where.pos.0 + where.half_size.0\n                and pos.1 <= where.pos.1 + where.half_size.1\n            ) then (\n                return :Some (what);\n            )\n        );\n        check(state^.play_button_pos, :Play);\n        check(state^.fullscreen_button_pos, :Fullscreen);\n        check(state^.mute_button_pos, :Mute);\n        :None\n    );\n    \n    const handle_event = (state :: &mut State, event :: geng.input.Event) => (\n        match event with (\n            | :PointerPress { .pos } => (\n                match what_is_clicked(&state^, pos) with (\n                    | :Some (:Play) => (\n                        if state^.player is :None then (\n                            state |> restart;\n                        );\n                    )\n                    | :Some (:Fullscreen) => (\n                        geng.toggle_fullscreen();\n                    )\n                    | :Some (:Mute) => (\n                        muted = not muted;\n                        geng.audio.set_master_volume(if muted then 0 else 1);\n                    )\n                    | :None => ()\n                );\n            )\n            | _ => ()\n        );\n    );\n    \n    const update = (state :: &mut State, dt :: Float32) => (\n        let framebuffer_size = {\n            geng_ctx.canvas_size.width,\n            geng_ctx.canvas_size.height,\n        };\n        while state^.camera.pos.0 > state^.next_spawn do (\n            state |> spawn;\n            state^.next_spawn = (\n                state^.camera.pos.0\n                + std.random.gen_range(...SPAWN_DISTANCE)\n            );\n        );\n        let despawn = collection => (\n            while Treap.length(&collection^) != 0 do (\n                let first = Treap.at(&collection^, 0);\n                if first^.pos.0 < state^.camera.pos.0 - FOV then (\n                    { _, collection^ } = Treap.split_at(collection^, 1);\n                ) else break;\n            );\n        );\n        despawn(&mut state^.enemies);\n        despawn(&mut state^.stars);\n        if state^.player is :Some (ref mut player) then (\n            player^.vel.0 = min(player^.vel.0 + PLAYER_ACCEL * dt, PLAYER_SPEED);\n            let up = (\n                geng.input.Key.is_pressed(:Space)\n                or geng.input.Key.is_pressed(:ArrowUp)\n                or geng.input.is_any_pointer_pressed()\n            );\n            player^.vel.1 = clamp(\n                player^.vel.1 + (if up then +1 else -1) * PLAYER_ACCEL * dt,\n                .min = -PLAYER_MAX_VERTICAL_SPEED,\n                .max = +PLAYER_MAX_VERTICAL_SPEED,\n            );\n            if up and player^.on_ground then (\n                player^.vel.1 = JUMP_SPEED;\n                geng.audio.play(assets.sfx.jump);\n            );\n            player |> Entity.update(dt);\n            if player^.pos.1 < GROUND + player^.half_size.1 then (\n                player^.vel.1 = 0;\n                player^.pos.1 = GROUND + player^.half_size.1;\n                player^.on_ground = true;\n            ) else (\n                player^.on_ground = false;\n            );\n            if player^.pos.1 > MAX_HEIGHT - player^.half_size.1 then (\n                player^.vel.1 = 0;\n                player^.pos.1 = MAX_HEIGHT - player^.half_size.1;\n            );\n            let half_screen = 0.5 * FOV * framebuffer_size.0 / framebuffer_size.1;\n            state^.camera.pos.0 = (\n                player^.pos.0\n                + half_screen\n                - min(PLAYER_OFFSET, half_screen)\n            );\n        );\n        let update_collection = (collection, entity_type) => (\n            let mut to_despawn = ArrayList.new();\n            for { i, entity } in Treap.iter_mut(collection) |> std.iter.enumerate do (\n                entity |> Entity.update(dt);\n                if state^.player is :Some (ref player_entity) then (\n                    if check_collision(&entity^, player_entity) then (\n                        match entity_type with (\n                            | :Enemy => (\n                                state^.player = :None;\n                                geng.audio.play(assets.sfx.hit);\n                            )\n                            | :Star => (\n                                ArrayList.push_back(&mut to_despawn, i);\n                                geng.audio.play(assets.sfx.pickup_star);\n                                state^.score += 1;\n                            )\n                        );\n                    );\n                );\n            );\n            const pop_back = [T] (a :: &mut ArrayList.t[T]) -> Option.t[T] => (\n                let length = Treap.length(&a^.inner);\n                if length == 0 then :None else (\n                    { a^.inner, (let node) } = Treap.split_at(a^.inner, Treap.length(&a^.inner) - 1);\n                    let :Node (data) = node;\n                    :Some (data.value)\n                )\n            );\n            \n            loop (\n                if pop_back(&mut to_despawn) is :Some (i) then (\n                    let { before, i_and_after } = Treap.split_at(collection^, i);\n                    let { _, after } = Treap.split_at(i_and_after, 1);\n                    collection^ = Treap.join(before, after);\n                ) else break;\n            );\n        );\n        update_collection(&mut state^.enemies, :Enemy);\n        update_collection(&mut state^.stars, :Star);\n    );\n    \n    const draw = (state :: &mut State) => (\n        let framebuffer_size = {\n            geng_ctx.canvas_size.width,\n            geng_ctx.canvas_size.height,\n        };\n        with geng.CameraCtx = geng.CameraUniforms.init(\n            state^.camera,\n            .framebuffer_size,\n        );\n        \n        ugli.clear(BACKGROUND_COLOR);\n        draw_grass();\n        draw_clouds();\n        for entity in Treap.iter(&state^.enemies) do (\n            entity |> Entity.draw;\n        );\n        for entity in Treap.iter(&state^.stars) do (\n            entity |> Entity.draw;\n        );\n        if state^.player is :Some (ref entity) then (\n            entity |> Entity.draw;\n        ) else (\n            state^.play_button_pos = {\n                .pos = { state^.camera.pos.0, 2 },\n                .half_size = Vec2.div(assets.textures.play.size, 32),\n            };\n            geng.draw_quad(\n                ...state^.play_button_pos,\n                .texture = assets.textures.play,\n            );\n            \n            state^.fullscreen_button_pos = {\n                .pos = { state^.camera.pos.0, 0.8 },\n                .half_size = Vec2.div(assets.textures.fullscreen.size, 64),\n            };\n            geng.draw_quad(\n                ...state^.fullscreen_button_pos,\n                .texture = assets.textures.fullscreen,\n            );\n            \n            state^.mute_button_pos = {\n                .pos = { state^.camera.pos.0, 0.4 },\n                .half_size = Vec2.div(assets.textures.mute.size, 64),\n            };\n            geng.draw_quad(\n                ...state^.mute_button_pos,\n                .texture = if muted then (\n                    assets.textures.muted\n                ) else (\n                    assets.textures.mute\n                ),\n            );\n        );\n        \n        draw_score(&state^);\n    );\n    \n    const draw_score = (state :: &State) => (\n        let pos = {\n            state^.camera.pos.0 + 0.4,\n            -0.7,\n        };\n        &assets.font\n            |> font.Font.draw(\n                \"score:\",\n                .pos,\n                .size = 0.3,\n                .color = { 1, 1, 1, 1 },\n                .align = 1\n            );\n        &assets.font\n            |> font.Font.draw(\n                state^.score |> to_string,\n                .pos,\n                .size = 0.3,\n                .color = { 1, 1, 1, 1 },\n                .align = 0\n            );\n    );\n    \n    const draw_background = (\n        .level :: Float32,\n        .top :: Bool,\n        .texture :: ugli.Texture,\n        .texture_offset :: Float32,\n    ) => (\n        let camera = (@current geng.CameraCtx);\n        let geng = (@current geng.Context);\n        let program = assets.shaders.background;\n        program |> ugli.Program.@\"use\";\n        \n        let mut draw_state = ugli.DrawState.init();\n        let draw_state = &mut draw_state;\n        \n        program |> ugli.set_uniform(\"u_level\", level, draw_state);\n        let top :: Float32 = if top then 1 else 0;\n        program |> ugli.set_uniform(\"u_top\", top, draw_state);\n        program |> ugli.set_uniform(\"u_texture_offset\", texture_offset, draw_state);\n        program |> ugli.set_uniform(\"u_view_matrix\", camera.view_matrix, draw_state);\n        program |> ugli.set_uniform(\"u_projection_matrix\", camera.projection_matrix, draw_state);\n        program |> ugli.set_uniform(\"u_texture\", texture, draw_state);\n        program |> ugli.set_uniform(\"u_texture_size_in_world_coords\", Vec2.mul(texture.size, 2 * 0.3 / 16), draw_state);\n        program |> ugli.set_vertex_data_source(geng.quad.buffer);\n        gl.draw_arrays(gl.TRIANGLE_FAN, 0, 4);\n    );\n    \n    const draw_grass = () => (\n        draw_background(\n            .level = GROUND,\n            .top = false,\n            .texture = assets.textures.grass,\n            .texture_offset = 0.7,\n        );\n    );\n    \n    const draw_clouds = () => (\n        draw_background(\n            .level = MAX_HEIGHT,\n            .top = true,\n            .texture = assets.textures.clouds,\n            .texture_offset = 0.25,\n        );\n    );\n);\n\nlet mut t = time.now();\n\nlet mut state = State.init();\n\nloop (\n    let framebuffer_size = {\n        geng_ctx.canvas_size.width,\n        geng_ctx.canvas_size.height,\n    };\n    let dt = (\n        let new_t = time.now();\n        let dt = new_t - t;\n        t = new_t;\n        dt\n    );\n    for event in geng.input.iter_events() do (\n        State.handle_event(&mut state, event);\n    );\n    State.update(&mut state, dt);\n    State.draw(&mut state);\n    \n    geng.await_next_frame();\n);\n","use (import \"./common.ks\").*;\nconst gl = import \"./gl/gl.ks\";\nconst ugli = import \"./ugli.ks\";\nconst geng = import \"./geng/_lib.ks\";\nuse std.collections.OrdMap;\n\nmodule:\n\nconst TilePos = Vec2;\n\nconst RangeConfig = newtype {\n    .start :: Char,\n    .end :: Char,\n    .at :: TilePos,\n};\n\nconst Config = newtype {\n    .tile_size :: Vec2,\n    .kerning :: Float32,\n    .space_size :: Float32,\n    .chars :: js.Obj.t[TilePos],\n    .ranges :: js.List.t[RangeConfig],\n};\n\nconst UvRect = newtype {\n    .pos :: Vec2,\n    .size :: Vec2,\n};\n\nconst Font = newtype {\n    .config :: Config,\n    .unit_space_size :: Float32,\n    .texture :: ugli.Texture,\n    .chars :: OrdMap.t[Char, UvRect],\n    .program :: ugli.Program,\n};\n\nconst single_char = (s :: String) -> Char => (\n    if s |> String.length != 1 then (\n        panic(\"c.length != 1\");\n    );\n    s |> String.at(0)\n);\n\nimpl Font as module = (\n    module:\n    \n    const load = (path :: String) -> Font => (\n        let config :: Config = fetch_string(path + \"/config.json\") |> js.json_parse;\n        let texture = geng.load_texture(path + \"/texture.png\", :Nearest);\n        let mut chars = OrdMap.new();\n        let tile_size_uv = Vec2.vdiv(config.tile_size, texture.size);\n        let uv_rect = (tile_pos :: Vec2) -> UvRect => {\n            .pos = Vec2.vdiv(Vec2.vmul(tile_pos, config.tile_size), texture.size),\n            .size = tile_size_uv,\n        };\n        let texture_size_tiles = Vec2.vdiv(texture.size, config.tile_size);\n        let add_c = (c :: Char, tile_pos :: Vec2) => (\n            let tile_pos :: Vec2 = {\n                tile_pos.0,\n                texture_size_tiles.1 - 1 - tile_pos.1,\n            };\n            # dbg.print(.c, .tile_pos, .uv_rect = uv_rect(tile_pos));\n            &mut chars\n                |> OrdMap.add(c, uv_rect(tile_pos));\n        );\n        for { c, tile_pos } in config.chars |> js.Obj.iter do (\n            add_c(c |> single_char, tile_pos);\n        );\n        for range in config.ranges |> js.List.iter do (\n            let mut tile_pos = range.at;\n            for c in Char.code(range.start)..Char.code(range.end) + 1 do (\n                add_c(Char.from_code(c), tile_pos);\n                tile_pos.0 += 1;\n            );\n        );\n        let program = geng.load_shader(\"assets/shaders/font\");\n        {\n            .unit_space_size = config.space_size / config.tile_size.1,\n            .config,\n            .texture,\n            .chars,\n            .program,\n        }\n    );\n    \n    const measure = (font :: &Font, text :: String) -> Float32 => (\n        let size :: Float32 = 1;\n        let tile_size = font^.config.tile_size;\n        let single_char_size = Vec2.mul({ tile_size.0 / tile_size.1, 1 }, size);\n        let mut result = 0;\n        for c in text |> String.iter do (\n            if c == ' ' then (\n                result += font^.unit_space_size * size;\n                continue;\n            );\n            result += single_char_size.0;\n        );\n        result\n    );\n    \n    const draw = (\n        font :: &Font,\n        text :: String,\n        .pos :: Vec2,\n        .size :: Float32,\n        .color :: Vec4,\n        .align :: Float32,\n    ) => (\n        let ctx = (@current geng.Context);\n        let camera = (@current geng.CameraCtx);\n        let program = font^.program;\n        program |> ugli.Program.@\"use\";\n        \n        let mut draw_state = ugli.DrawState.init();\n        let draw_state = &mut draw_state;\n        \n        program |> ugli.set_vertex_data_source(ctx.quad.buffer);\n        \n        program |> ugli.set_uniform(\"u_view_matrix\", camera.view_matrix, draw_state);\n        program |> ugli.set_uniform(\"u_projection_matrix\", camera.projection_matrix, draw_state);\n        program |> ugli.set_uniform(\"u_texture\", font^.texture, draw_state);\n        program |> ugli.set_uniform(\"u_color\", color, draw_state);\n        \n        let tile_size = font^.config.tile_size;\n        let single_char_size = Vec2.mul({ tile_size.0 / tile_size.1, 1 }, size);\n        program |> ugli.set_uniform(\"u_size\", single_char_size, draw_state);\n        let mut pos :: Vec2 = { pos.0 - measure(font, text) * align * size, pos.1 };\n        for c in text |> String.iter do (\n            if c == ' ' then (\n                pos.0 += font^.unit_space_size * size;\n                continue;\n            );\n            match &font^.chars |> OrdMap.get(c) with (\n                | :None => panic(\"Char \" + to_string(c) + \" is not in font\")\n                | :Some (&uv) => (\n                    program |> ugli.set_uniform(\"u_uv_rect_pos\", uv.pos, draw_state);\n                    program |> ugli.set_uniform(\"u_uv_rect_size\", uv.size, draw_state);\n                )\n            );\n            program |> ugli.set_uniform(\"u_pos\", pos, draw_state);\n            gl.draw_arrays(gl.TRIANGLE_FAN, 0, 4);\n            \n            pos.0 += single_char_size.0;\n        );\n    );\n);\n","module:\n\nconst t = [T] newtype (\n    | :Nil\n    | :Cons {\n        .value :: T,\n        .tail :: t[T],\n    }\n);\n\nconst into_iter = [T] (list :: t[T]) -> std.iter.Iterable[T] => {\n    .iter = f => match list with (\n        | :Nil => ()\n        | :Cons { .value, .tail } => (\n            f(value);\n            into_iter(tail).iter(f);\n        )\n    ),\n};\n\nconst iter = [T] (list :: &t[T]) -> std.iter.Iterable[type (&T)] => {\n    .iter = f => match list^ with (\n        | :Nil => ()\n        | :Cons { .value = ref value, .tail = ref tail } => (\n            f(value);\n            iter(tail).iter(f);\n        )\n    ),\n};","module:\nconst print = [T] (value :: T) -> () => @cfg (\n    | target.name == \"interpreter\" => (@native \"dbg.print\")(value)\n    | target.name == \"javascript\" => (@native \"Kast.dbg.print\")(value)\n);\n","module:\nconst read_file :: String -> String = path => @cfg (\n    | target.name == \"interpreter\" => (@native \"fs.read_file\")(path)\n    | target.name == \"javascript\" => (@native \"Kast.fs.read_file\")(path)\n);\n","module:\nconst print = (line :: String) -> () => (\n    @cfg (\n        | target.name == \"interpreter\" => (@native \"io.print\")(line)\n        | target.name == \"ocaml\" => (@native \"@natives.print\")(line)\n        | target.name == \"javascript\" => (@native \"Kast.io.print\")(line)\n    )\n);\n# similar to print, but print to stderr\nconst eprint = (line :: String) -> () => (\n    @cfg (\n        | target.name == \"interpreter\" => (@native \"io.eprint\")(line)\n        | target.name == \"ocaml\" => (@native \"@natives.eprint\")(line)\n        | target.name == \"javascript\" => (@native \"Kast.io.eprint\")(line)\n    )\n);\nconst input = (prompt :: String) -> String => (\n    @cfg (\n        | target.name == \"interpreter\" => (@native \"io.input\")(prompt)\n        | target.name == \"ocaml\" => (@native \"@natives.input\")(prompt)\n        | target.name == \"javascript\" => (@native \"Kast.io.input\")(prompt)\n    )\n)\n","module:\n\nconst Iterable = [Item] newtype {\n    .iter :: (Item -> ()) -> ()\n};\n\nconst ReversibleIterable = [Item] newtype {\n    .iter :: (Item -> ()) -> (),\n    .rev :: () -> ReversibleIterable[Item],\n};\n\nconst map = [A, B] (\n    iter :: Iterable[A],\n    f :: A -> B,\n) -> Iterable[B] => {\n    .iter = consume => (\n        iter.iter(a => consume(f(a)))\n    )\n};\n\nconst enumerate = [T] (\n    iter :: Iterable[T]\n) -> Iterable[type { Int32, T }] => (\n    let mut i = 0;\n    {\n        .iter = consume => (\n            iter.iter(\n                x => (\n                    consume({ i, x });\n                    i += 1;\n                )\n            );\n        ),\n    }\n);\n\nconst reduce = [T] (\n    iter :: Iterable[T], \n    f :: (T, T) -> T,\n) -> Option.t[T] => (\n    let mut result = :None;\n    iter.iter(x => (\n        result = :Some (match result with (\n            | :None => x\n            | :Some prev => f(prev, x)\n        ));\n    ));\n    result\n);","module:\nconst dirname :: String -> String = path => (\n    let slash_idx = String.last_index_of('/', path);\n    String.substring(path, 0, slash_idx)\n);\n","module:\n\nconst range = (start :: Int32, end :: Int32) -> std.iter.ReversibleIterable[Int32] => (\n    let forward = consumer => (\n        let mut i = start;\n        while i < end do (\n            consumer(i);\n            i += 1;\n        );\n    );\n    let backward = consumer => (\n        let mut i = end;\n        while i > start do (\n            i -= 1;\n            consumer(i);\n        );\n    );\n    (\n        module:\n        let construct = (.forward, .backward) => {\n            .iter = forward,\n            .rev = () => construct(.forward = backward, .backward = forward),\n        };\n    ).construct(.forward, .backward)\n)\n","module:\nconst chdir :: String -> () = path => @cfg (\n    | target.name == \"interpreter\" => (@native \"sys.chdir\")(path)\n    | target.name == \"javascript\" => (@native \"Kast.sys.chdir\")(path)\n);\nconst argc = () -> Int32 => @cfg (\n    | target.name == \"interpreter\" => (@native \"sys.argc\")()\n    | target.name == \"javascript\" => (@native \"Kast.sys.argc\")()\n);\nconst argv_at = (idx :: Int32) -> String => @cfg (\n    | target.name == \"interpreter\" => (@native \"sys.argv_at\")(idx)\n    | target.name == \"javascript\" => (@native \"Kast.sys.argv_at\")(idx)\n);\n# accepts the command to exec, returns the return-code\nconst exec = (cmd :: String) -> Int32 => @cfg (\n    | target.name == \"interpreter\" => (@native \"sys.exec\")(cmd)\n    | target.name == \"javascript\" => (@native \"Kast.sys.exec\")(cmd)\n);\n# accepts the environment variable, returns its value if it exists or NotFound\nconst get_env = (var :: String) -> Option.t[String] => @cfg (\n    | target.name == \"interpreter\" => (@native \"sys.get_env\")(var)\n    | target.name == \"javascript\" => (@native \"Kast.sys.get_env\")(var)\n);\n# exit with the provided return code\nconst exit = [T] (status_code :: Int32) -> T => @cfg (\n    | target.name == \"interpreter\" => (@native \"sys.exit\")(status_code)\n    | target.name == \"javascript\" => (@native \"Kast.sys.exit\")(status_code)\n);\n","module:\n\nconst Float32 = Float64;\n\nconst Vec2 = newtype { Float32, Float32 };\n\nimpl Vec2 as module = (\n    module:\n    const add = (a :: Vec2, b :: Vec2) -> Vec2 => (\n        { a.0 + b.0, a.1 + b.1 }\n    );\n    const sub = (a :: Vec2, b :: Vec2) -> Vec2 => (\n        { a.0 - b.0, a.1 - b.1 }\n    );\n    const mul = (v :: Vec2, k :: Float32) -> Vec2 => (\n        { v.0 * k, v.1 * k }\n    );\n    const div = (v :: Vec2, k :: Float32) -> Vec2 => (\n        { v.0 / k, v.1 / k }\n    );\n    const vmul = (a :: Vec2, b :: Vec2) -> Vec2 => (\n        { a.0 * b.0, a.1 * b.1 }\n    );\n    const vdiv = (a :: Vec2, b :: Vec2) -> Vec2 => (\n        { a.0 / b.0, a.1 / b.1 }\n    );\n    \n    const map = (v :: Vec2, f :: Float32 -> Float32) -> Vec2 => (\n        { f(v.0), f(v.1) }\n    )\n);\n\nconst Vec3 = newtype { Float32, Float32, Float32 };\n\nimpl Vec3 as module = (\n    module:\n    \n    const dot = (a :: Vec3, b :: Vec3) -> Float32 => (\n        a.0 * b.0 + a.1 * b.1 + a.2 * b.2\n    );\n);\n\nconst Vec4 = newtype { Float32, Float32, Float32, Float32 };\n\nconst Mat3 = newtype { Vec3, Vec3, Vec3 };\n\nimpl Mat3 as module = (\n    module:\n    \n    const transpose = (m :: Mat3) -> Mat3 => {\n        { m.0.0, m.1.0, m.2.0 },\n        { m.0.1, m.1.1, m.2.1 },\n        { m.0.2, m.1.2, m.2.2 },\n    };\n    \n    const div = (m :: Mat3, k :: Float32) -> Mat3 => {\n        { m.0.0 / k, m.0.1 / k, m.0.2 / k },\n        { m.1.0 / k, m.1.1 / k, m.1.2 / k },\n        { m.2.0 / k, m.2.1 / k, m.2.2 / k },\n    };\n    \n    const mul_mat = (a :: Mat3, b :: Mat3) -> Mat3 => (\n        let b = transpose(b);\n        const dot = Vec3.dot;\n        let result = {\n            { dot(a.0, b.0), dot(a.0, b.1), dot(a.0, b.2) },\n            { dot(a.1, b.0), dot(a.1, b.1), dot(a.1, b.2) },\n            { dot(a.2, b.0), dot(a.2, b.1), dot(a.2, b.2) },\n        };\n        # dbg.print(.a, .b, .result);\n        result\n    );\n    \n    const inverse = (m :: Mat3) -> Mat3 => (\n        let {\n            { a00, a01, a02 },\n            { a10, a11, a12 },\n            { a20, a21, a22 },\n        } = m;\n        \n        let b01 = a22 * a11 - a12 * a21;\n        let b11 = -a22 * a10 + a12 * a20;\n        let b21 = a21 * a10 - a11 * a20;\n        \n        let det = a00 * b01 + a01 * b11 + a02 * b21;\n        \n        div(\n            {\n                { b01, -a22 * a01 + a02 * a21, a12 * a01 - a02 * a11 },\n                { b11, a22 * a00 - a02 * a20, -a12 * a00 + a02 * a10 },\n                { b21, -a21 * a00 + a01 * a20, a11 * a00 - a01 * a10 },\n            },\n            det\n        )\n    );\n    \n    const mul_vec = (m :: Mat3, v :: Vec3) -> Vec3 => (\n        # dbg.print(\"BEFORE MUL\", .m, .v);\n        let result = {\n            Vec3.dot(m.0, v),\n            Vec3.dot(m.1, v),\n            Vec3.dot(m.2, v),\n        };\n        # dbg.print(.m, .v, .result);\n        result\n    );\n);\n","impl Char as module = (\n    module:\n    const is_whitespace = (c :: Char) -> Bool => (\n        c == ' ' or c == '\\n' or c == '\\t'\n    );\n    const is_uppercase = (c :: Char) -> Bool => (\n        code(c) >= (@eval code('A')) and code(c) <= (@eval code('Z'))\n    );\n    const is_lowercase = (c :: Char) -> Bool => (\n        code(c) >= (@eval code('a')) and code(c) <= (@eval code('z'))\n    );\n    const to_uppercase = (c :: Char) -> Char => (\n        if is_lowercase(c) then (\n            code(c) - (@eval (Char.code('a') - Char.code('A')))\n                |> from_code\n        ) else (\n            c\n        )\n    );\n    const to_lowercase = (c :: Char) -> Char => (\n        if is_uppercase(c) then (\n            code(c) + (@eval (Char.code('a') - Char.code('A')))\n                |> from_code\n        ) else (\n            c\n        )\n    );\n    const code = (c :: Char) -> UInt32 => @cfg (\n        | target.name == \"interpreter\" => (@native \"char.code\")(c)\n        | target.name == \"javascript\" => (@native \"Kast.Char.code\")(c)\n    );\n    const from_code = (code :: UInt32) -> Char => @cfg (\n        | target.name == \"interpreter\" => (@native \"char.from_code\")(code)\n        | target.name == \"javascript\" => (@native \"Kast.Char.from_code\")(code)\n    );\n    const to_digit_radix = (c :: Char, radix :: UInt32) -> UInt32 => (\n        let code = code(c);\n        let digit = if '0' <= c and c <= '9' then (\n            code - (@eval Char.code('0'))\n        ) else if 'a' <= c and c <= 'z' then (\n            code - (@eval Char.code('a')) + 10\n        ) else if 'A' <= c and c <= 'Z' then (\n            code - (@eval Char.code('A')) + 10\n        ) else (\n            panic(\"char is not digit\")\n        );\n        if radix < 2 or digit >= radix then (\n            panic(\"digit >= radix\")\n        );\n        digit\n    );\n    const to_digit = c => to_digit_radix(c, 10);\n    const from_digit_radix = (digit :: UInt32, radix :: UInt32) -> Char => (\n        if radix < 2 or digit >= radix then (\n            panic(\"digit >= radix\")\n        );\n        if digit < 10 then (\n            from_code(digit + (@eval Char.code('0')))\n        ) else (\n            from_code(digit - 10 + (@eval Char.code('a')))\n        )\n    );\n    const from_digit = digit => from_digit_radix(digit, 10);\n);\n","module:\n\nconst tcp = (\n    module:\n    \n    const Stream = @opaque_type;\n    \n    impl Stream as module = (\n        module:\n        const connect = (addr :: String) -> Stream => @cfg (\n            | target.name == \"interpreter\" => (@native \"net.tcp.connect\")(addr)\n            | target.name == \"javascript\" => (@native \"Kast.net.tcp.connect\")(addr)\n        );\n        \n        const read_line = (stream :: &mut Stream) -> String => @cfg (\n            | target.name == \"interpreter\" => (@native \"net.tcp.read_line\")(stream)\n            | target.name == \"javascript\" => (@native \"Kast.net.tcp.stream.read_line\")(stream)\n        );\n        \n        const write = (stream :: &mut Stream, data :: &String) -> () => @cfg (\n            | target.name == \"interpreter\" => (@native \"net.tcp.write\")(stream, data)\n            | target.name == \"javascript\" => (@native \"Kast.net.tcp.stream.write\")(stream, data)\n        );\n        \n        const close = (stream :: Stream) -> () => @cfg (\n            | target.name == \"interpreter\" => (@native \"net.tcp.stream.close\")(stream)\n            | target.name == \"javascript\" => (@native \"Kast.net.tcp.stream.close\")(stream)\n        );\n    );\n    \n    const Listener = @opaque_type;\n    \n    impl Listener as module = (\n        module:\n        \n        const bind = (addr :: String) -> Listener => @cfg (\n            | target.name == \"interpreter\" => (@native \"net.tcp.bind\")(addr)\n            | target.name == \"javascript\" => (@native \"Kast.net.tcp.bind\")(addr)\n        );\n        \n        const listen = (listener :: &mut Listener, max_pending :: Int32) -> () => @cfg (\n            | target.name == \"interpreter\" => (@native \"net.tcp.listen\")(listener, max_pending)\n            | target.name == \"javascript\" => (@native \"Kast.net.tcp.listener.listen\")(listener, max_pending)\n        );\n        \n        const accept = (listener :: &mut Listener, .close_on_exec :: Bool) -> {\n            .stream :: Stream,\n            .addr :: String\n        } => @cfg (\n            | target.name == \"interpreter\" => (@native \"net.tcp.accept\")(listener, close_on_exec)\n            | target.name == \"javascript\" => (@native \"Kast.net.tcp.listener.accept\")(listener, close_on_exec)\n        );\n        \n        const close = (listener :: Listener) -> () => @cfg (\n            | target.name == \"interpreter\" => (@native \"net.tcp.listener.close\")(listener)\n            | target.name == \"javascript\" => (@native \"Kast.net.tcp.listener.close\")(listener)\n        );\n    );\n)\n","use (import \"./la.ks\").*;\n\nmodule:\n\nconst Vertex = newtype {\n    .a_pos :: Vec3,\n};\n\nconst Face = newtype {\n    .a :: Vertex,\n    .b :: Vertex,\n    .c :: Vertex,\n};\n\nconst strip_prefix = (s :: String, prefix :: String) -> Option.t[String] => (\n    if prefix |> String.length > s |> String.length then (\n        :None\n    ) else if (s |> String.substring(0, String.length(prefix)) == prefix) then (\n        :Some (s |> String.substring(String.length(prefix), String.length(s) - String.length(prefix)))\n    ) else (\n        :None\n    )\n);\n\nconst parse = (s :: String) -> ArrayList.t[Face] => (\n    let mut result = ArrayList.new();\n    let mut vs = ArrayList.new();\n    let vertex = (s :: String) -> Vertex => (\n        # let v, vt_vn = s |> String.split_once('/');\n        let v :: Int32 = String.parse(s);\n        ArrayList.at(&vs, v - 1)^\n    );\n    for line in s |> String.lines do (\n        if line |> strip_prefix(\"v \") is :Some (s) then (\n            dbg.print(s);\n            let { x, yz } = s |> String.split_once(' ');\n            let { y, z } = yz |> String.split_once(' ');\n            let x = x |> String.parse;\n            let y = y |> String.parse;\n            let z = z |> String.parse;\n            let vertex :: Vertex = {\n                .a_pos = { x, y, z },\n            };\n            &mut vs |> ArrayList.push_back(vertex);\n        ) else if line |> strip_prefix(\"f \") is :Some (s) then (\n            dbg.print(s);\n            let { a, bc } = s |> String.split_once(' ');\n            let { b, c } = bc |> String.split_once(' ');\n            let face :: Face = {\n                .a = vertex(a),\n                .b = vertex(b),\n                .c = vertex(c),\n            };\n            ArrayList.push_back(&mut result, face);\n        );\n    );\n    result\n);\n","module:\n\nconst la = import \"./la.ks\";\nuse la.*;\n\nconst js = import \"./js.ks\";\nconst web = import \"./web.ks\";\nconst gl = import \"./gl/gl.ks\";\nconst ugli = import \"./ugli.ks\";\nconst obj = import \"./obj.ks\";\n\nuse (import \"./common.ks\").*;\n\nconst geng = import \"./geng/_lib.ks\";\nconst font = import \"./font.ks\";\n"],"names":["Self","T","x","a","b","program","shader","ctx","target","buffer","texture","red","green","blue","alpha","mode","mode_rgb","mode_alpha","src_factor","dst_factor","src_rgb","dst_rgb","src_alpha","dst_alpha","src_data","usage","bits","r","g","list","f","obj","any","_arg","_f","json","data","U","shader_type","index","first","count","cap","pname","name","value","source","level","internal_format","format","type","param","size","normalized","stride","offset","location","state","_ref","c","add","row","y","z","w","min","max","v","root","left","right","other","left_data","right_data","node","left_left","left_right","right_left","right_right","idx","this_node_idx","s","t_to_string","result","i","loop_block","loop_body","q","V","K","map","key","init","less","greater_or_equal","equal","greater","fields","field","get","field_data","vertex","path","num","ty","options","volume","color","opt","default","compile_status","log","_returnable","info","uniform_info","attribute_info","pos","half_size","camera","draw_state","document","canvas","webgl","vertex_shader","fragment_shader","quad","geng","rest","events","e","button","runtime","consumer","event","url","filter","full","top","texture_offset","assets","geng_ctx","framebuffer_size","entity","muted","screen_pos","where","what","check","tail","line","prompt","Item","iter","consume","A","B","prev","slash_idx","start","end","forward","backward","cmd","status_code","var","is_enemy","collection","length","dt","despawn","player","up","half_screen","entity_type","to_despawn","player_entity","check_collision","before","i_and_after","after","update_collection","m","k","a00","a01","a02","a10","a11","a12","a20","a21","a22","b01","b11","b21","det","id","context_type","height","width","image","handle","t","wrap","link_status","active_attributes","attributes","active_info","active_uniforms","uniforms","gl_screen_pos","world_pos","view_matrix","aspect","projection_matrix","raw","font","text","tile_size","single_char_size","align","uv","config","chars","tile_size_uv","tile_pos","uv_rect","texture_size_tiles","add_c","range","code","digit","radix","len","search","c_at_i","sep","part","perform_split","old","new","replaced_rest","next_alphabet","stream","addr","listener","close_on_exec","max_pending","prefix","vs","yz","bc","face","web","ugli","time","load_image","la","js","gl","fetch_string","clamp","await_animation_frame","abs","Vec4","Vec3","Vec2","Mat3","Float32","gl_ctx","new_t"],"mappings":"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"}