 Hi guys, Myself Thamir Vendan. So since we have five minutes, I'm just getting started with what this talk is all about. So it's all about building a low-code platform in Clojure. So if you are not aware of low-code platform, typical programs we develop by writing code. Whereas in low-code platform where we allow a business user or a programmer to develop the application software without doing the typical conventional programming. So we choose one of the project that we recently did in our company is where we did similar kind of platform for one of our client, and we leveraged Clojure. The reason why we leveraged Clojure is because of this particular piece like in Clojure code is data and data is code. Since configuration is code, data we just leveraged it and develop the platform. So I'm just going to quickly show you a prototype of what we did in our project. So here what you are seeing is the Clojure code. Here I'm just showing you the configuration of building a page. I just need a page which shows a list of movies. Here in the configuration, what I'm saying is go and look at the table film and I'm interested in the title and the description and the release here. When you show this list for this table, use this as the column name. Here just we are describing what we want to show in the page as a definition here. So I'm just running that. So if you look at this is the page layout that I'm actually looking at. I just want to display a page with only the movies list as my screen. I'm just starting the server which will create a HTTP server for the backend to render the page. So now I'm asking to render the page layout. If you look at now the layout showed up. Now think of you are giving this dashboard to a business user where he wants to put charts to it. So I'm just extending this page layout to some few more things. This is a new page load where it's at two column like a grid where the first loss. We are showing a movies list. Then I'm going to show a chart. In the second row, I'm going to see a customers list where I'm going to see a different chart. So all those thing again if you look at all configuration. Here this is a line chart I want to draw and this is the table and x-axis, this is the column, y-axis, this is the column. So all the screen that I want to develop, I just need showing this as a data. Now I'm just running this new page layout. If you look at the entire screen has been drawn. This is a point chart and all those things. If you look at the client wanted a feature where the business user will come and he will be creating a dashboard for himself and the dashboard can be contain like a chart, list, whatever kind of things. So whatever we have did here is the kind of prototype. But in the real time, we have added all those nice little UI, menu and all those things so that to the end user, it does not look like whether it is created through configuration or through custom software development. So that's it. Wow, 40 seconds. Yes. So the beauty is the code that we have written. It's very elusive. If you look at the DB code generation that I'm just talking about. So let me take the list widget or the chart. That from the definition here, if you look at, I'm just selecting the select and frame. Now from the definition, now I have a representation of a database query and here, I'm just running that query. Yeah. So maybe offline I can help you out. Yeah. All right. Thank you, Thomas. Okay. I want to talk shortly about Backpack in Haskell. What is this and how you can use it and basically chart description. So what is Backpack? First, I want to mention that Backpack is not a Haskell specific thing. It's a general idea and you can implement these ideas for any compiler but turned out that it's first implementation is in Haskell for some reason. So it's just basically a mixing system where you can have files. Where you have functions without implementation, only types. So in Haskell, we have very common, very popular way to abstract since it's type classes. Type class basically just an interface. But type classes are not enough in some cases. So for example, you want to write polymorphic code, but because of the way how type classes represent it in GHC, they may impose some performance of your head. So this might not be important if you implement abstraction for database access, but it's important for string. If you have to abstract, like if you want to write a library that parses such something, you won't really use this to be performant. And if you implement this in type class manner, you will have some performance overhead. Another reason is that sometimes type classes are not really just a couple slides. So type class is not really readable. This is one of the implementation of type class for the map data types for containers. Because there are like multiple types for containers, there is map, which parameterized by two type variables. And there is int map, which parameterized by only one type variable. And because of that, if you want to implement type class which captures the both class, it will be really hard to use type families, functions from types. The interface will be complicated. And the abstract code, which is written in terms of this type class, will be really scary to read. The whole idea of having an abstraction is to write abstract code. But if this code is really hard to understand, really hard to read, there is actually no much benefit you can just copy-paste code. So what is, what backpack brings to the table? So in backpack, there is a file you call signature file. It has extension hsig. Ordinary Haskell files has extension hs, and signature file has extension hsig. So in this file, you write only data types you need, and you write only types of the functions and their names. So you don't write implementation of those functions. And then you can write libraries and packages, which are depend only on this interface. So you can type check your code. Here's one example of group by function. You can see that the type is really simple as before, to just play in Haskell. If you compare these two type class solutions with type families. But the idea is that you can type check your code. Of course, there is no code generation still, because you don't have implementation of the functions. You have only types. But then later you can substitute some implementation. So you write some abstract functions in terms of backpack interface, signature interface. Then you implement this interface for some data type. So basically for map it's very simple. The types are already match the names and the types of functions from signature. And then it can be even simpler written to role removal boilerplate. So then you can write function. And in your dependencies, you specify the signature module and you specify the implementation. So we are moving on the package level. You have package that implements only signature. You have another package that implements the implementation for this signature, the instance. And then you can combine. And if you name your module in the same way as the signature module, but without extension, the JSC will detect automatically that the implementation signature is this module. But if you have multiple signatures, for example, if you have hash map. So there is map and hash map. You can use mix-ins, you can use mix-ins. So you can tell that I want this function to be named, this module to be named like here. And here I want the implementation of map as map or like order at map. And here you say, okay, I want another module exposed by another name, which uses implementation of map as map hash. Basically what it does is generate several packages. It's called generation where you have monomorphic functions. So the motivation behind the package to have better like type classes. You have performance guarantees and you can just write the same plain hash code. The types are really readable. Yes, and it works. There are some challenges for int-map still because of the way it works, but it's possible to overcome these challenges. So there's a package called containers-backpacket implements the signatures and you can see how it actually does this. That's it. Okay, thank you.