avatarEmy Knazovic

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

5070

Abstract

do that:</p><div id="2e8b"><pre>eventHandler<span class="hljs-selector-class">.Handle</span>(event1, <span class="hljs-built_in">ExampleMiddlewareFoo</span>(<span class="hljs-built_in">ExampleMiddlewareBar</span>(handle)))</pre></div><h1 id="a8a5">Managing Events with Handlers and Middleware</h1><p id="f869">Most articles I read explain how to use this design pattern; this one deals with implementing the internal logic. So let's start coding.</p><p id="35c4">The full code for this article can be found <a href="https://github.com/xNok/slack-go-demo-socketmode/blob/main/examples/middleware/main.go">here</a> to help you follow along.</p><h2 id="0f88">Designing events</h2><p id="b622">First, we are going to enumerate the list of events that our system can handle. The way we create enumeration in Go is a bit different than in other programming languages. In Go, we are going to use a set of constants sharing the same <code>type</code>. Here I define a type <code>EventType</code>that represents a string with the event's name.</p><div id="b181"><pre>// <span class="hljs-keyword">type</span> <span class="hljs-type">used </span>to enumerate events <span class="hljs-keyword">type</span> <span class="hljs-type">EventType </span>string</pre></div><div id="4817"><pre>const ( event1 EventType <span class="hljs-operator">=</span> <span class="hljs-string">"event1"</span> event2 EventType <span class="hljs-operator">=</span> <span class="hljs-string">"event2"</span> )</pre></div><p id="e041">Next, we define the event itself. In our example, the<code>Event</code> as a type which can be selected among the list of <code>EventType</code> created above.</p><div id="2bc9"><pre><span class="hljs-keyword">type</span> <span class="hljs-type">Event</span> struct { <span class="hljs-type">Type</span> <span class="hljs-type">EventType</span> <span class="hljs-type">Data</span> interface{} }</pre></div><h2 id="df6c">Create an event sender (for test purpose)</h2><p id="60aa">To test our system, we will need to create a small function to send events every 2s. Each<code>Event</code> is transmitted via a <a href="https://tour.golang.org/concurrency/2">channel</a> and, the <code>eventSender</code> below sends a random <code>Event</code> of type <code>event1</code> or <code>event2</code> to a channel.</p><blockquote id="53f3"><p><i>Channels are a type which you can send and receive values, they are great for communication among goroutines. In other words, there are perfect for sending and receive event through your application.</i></p></blockquote><div id="ffd1"><pre><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">eventSender</span><span class="hljs-params">(c <span class="hljs-keyword">chan</span> EventType)</span></span> {</pre></div><div id="7f57"><pre> for { // Send <span class="hljs-selector-tag">a</span> random event <span class="hljs-selector-tag">to</span> the channel rand<span class="hljs-selector-class">.Seed</span>(<span class="hljs-selector-tag">time</span><span class="hljs-selector-class">.Now</span>()<span class="hljs-selector-class">.Unix</span>()) events := []EventType{ event1, event2, } n := rand.<span class="hljs-built_in">Int</span>() % <span class="hljs-built_in">len</span>(events)</pre></div><div id="6101"><pre> c <- events[n] <span class="hljs-comment">// send event to channel</span></pre></div><div id="5285"><pre> // <span class="hljs-keyword">wait</span> a <span class="hljs-built_in">bit</span> <span class="hljs-built_in">time</span>.Sleep(<span class="hljs-number">2</span> * <span class="hljs-built_in">time</span>.Second) } }</pre></div><h2 id="000c">Handler and dispatcher</h2><p id="e562">We first need a struct to hold the list of events we want to listen to and which function to call whenever that event is transmitted. This struct also contains the channel used for communicating events.</p><div id="280d"><pre><span class="hljs-comment">// Create a struct to hold config</span> <span class="hljs-comment">// And simplify dependency injections</span> <span class="hljs-keyword">type</span> EventHandler <span class="hljs-keyword">struct</span> { <span class="hljs-comment">// Event channel</span> Events <span class="hljs-keyword">chan</span> Event <span class="hljs-comment">// hold the registedred event functionss</span> EventMap <span class="hljs-keyword">map</span>[EventType][]<span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">(Event)</span></span> }</pre></div><p id="aa6c">Next, we need to provide an initializing constructor for our <code>EventHandler</code>.</p><div id="a4ed"><pre><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">NewEventHandler</span><span class="hljs-params">()</span></span> *EventHandler { eventMap := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">map</span>[EventType][]<span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">(Event)</span></span>) event

Options

s := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">chan</span> Event)</pre></div><div id="78bb"><pre> return <span class="hljs-variable">&</span>EventHandler<span class="hljs-punctuation">{</span> <span class="hljs-symbol"> Events:</span> events, <span class="hljs-symbol"> EventMap:</span> eventMap, <span class="hljs-punctuation">}</span> <span class="hljs-punctuation">}</span></pre></div><p id="98fe">Then, we can create our <code>Handle</code> function that associates the event with a callback function.</p><div id="308c"><pre><span class="hljs-comment">// register the handler function to handle an event type</span> func (h *EventHandler) <span class="hljs-built_in">Handle</span>(e EventType, f <span class="hljs-built_in">func</span>(Event)) { h<span class="hljs-selector-class">.EventMap</span><span class="hljs-selector-attr">[e]</span> = <span class="hljs-built_in">append</span>(h<span class="hljs-selector-class">.EventMap</span><span class="hljs-selector-attr">[e]</span>, f) }</pre></div><p id="e42a">Finally, we create the <code>EventDispatcher</code> function, the core of this mechanism. The <code>EventDispatcher</code>process any event sent to a channel, check its type, and if any function has been registering for that type, we call all registered functions.</p><div id="6597"><pre><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(h *EventHandler)</span></span> EventDispatcher() { <span class="hljs-keyword">for</span> evt := <span class="hljs-keyword">range</span> h.Events { log.Printf(<span class="hljs-string">"event recieved: %v"</span>, evt) <span class="hljs-keyword">if</span> handlers, ok := h.EventMap[evt.Type]; ok { <span class="hljs-comment">// If we registered an event</span> <span class="hljs-keyword">for</span> _, f := <span class="hljs-keyword">range</span> handlers { <span class="hljs-comment">// exacute function as goroutine</span> <span class="hljs-keyword">go</span> f(evt) } } } }</pre></div><h1 id="13e4">Using our system</h1><p id="4d4e">Everything is ready; we can start using our event handling system.</p><ol><li>Instantiate our event Handler</li><li>Register which event to listen to and what function to callback</li><li>Start the event sender</li><li>Start the event dispatcher</li></ol><div id="62ab"><pre><span class="hljs-keyword">func</span> <span class="hljs-title function_">main</span><span class="hljs-params">()</span> {</pre></div><div id="5b09"><pre> <span class="hljs-variable">eventHandler</span> := <span class="hljs-function"><span class="hljs-title">NewEventHandler</span>()</span></pre></div><div id="d244"><pre> eventHandler.Handle(event1, <span class="hljs-keyword">func</span><span class="hljs-params">()</span> { <span class="hljs-built_in">log</span>.Printf(<span class="hljs-string">"event Handled: %v"</span>, event1) })</pre></div><div id="5c56"><pre> <span class="hljs-variable">go</span> <span class="hljs-function"><span class="hljs-title">eventSender</span>(<span class="hljs-variable">eventHandler.Events</span>)</span></pre></div><div id="30f2"><pre> eventHandler<span class="hljs-selector-class">.EventDispatcher</span>()</pre></div><div id="9bf2"><pre>}</pre></div><p id="e590">The result should be along those lines:</p><figure id="5ee7"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*_D-GCRSu3K8CgTBXewJjJQ.gif"><figcaption></figcaption></figure><p id="19d6">Since we only handle an event of type <code>event1</code>, only <code>event1</code> shows as <code>Hansled</code>. All is good!</p><p id="d48a">The full code for this article can be found <a href="https://github.com/xNok/slack-go-demo-socketmode/blob/main/examples/middleware/main.go">here</a>.</p><h1 id="6f5e">Interesting Articles tackling the same topic</h1><ul><li><a href="https://drstearns.github.io/tutorials/gomiddleware/">Middleware Patterns in Go</a></li><li><a href="https://sathishvj.medium.com/web-handlers-and-middleware-in-golang-2706c2ecfb75">Web Handlers and Middleware in GoLang</a></li><li><a href="https://readmedium.com/lightweight-event-management-implemented-by-go-a654d59ac65">Lightweight event management implemented by Go</a></li><li><a href="https://readmedium.com/the-7-most-important-software-design-patterns-d60e546afb0e">The 7 Most Important Software Design Patterns</a></li></ul><p id="13e7"><i>Do you want <b>unlimited access</b> to all my content and many other writers’ content on Medium? Consider using my affiliate link to <a href="https://couedeloalexandre.medium.com/membership">become a Medium member today</a></i></p><h2 id="853a">Further reads</h2> <figure id="81d2"> <div> <div> <img class="ratio" src="http://placehold.it/16x9"> <iframe class="" src="https://couedeloalexandre.medium.com/embed/list/3f9d03f2cb8f" allowfullscreen="" frameborder="0" height="184" width="undefined"> </div> </div> </figure></iframe></div></div></figure></article></body>

7 Signs You Are a Genius

Have you ever wondered if you have the signs of a genius? Excellent! Ready to find out what they are?

Knowing these signs can boost your confidence and allow you to express more of what’s inside of you authentically.

***If you’re not yet a Medium Member click here to read the full story.***

First of all, I believe that every single person on this planet has a genius within them.

It’s that unique, special spark each of us has in some way or another.

Maybe you light up the room when you step into it, maybe your writing inspires many people to change for the better, maybe you are a genius at math, science, or cooking.

It doesn’t really matter what it is.

If you believe any of these signs describe you, you are a genius.

1. Mess and Clutter doesn’t Bother You

Do you ever catch yourself staring at your messy desk, wondering if you should tidy it up or keep writing, creating, and bring your vision to life instead?

Congratulations!

A messy desk might be a sign that your mind is full of creativity.

Think of Albert Einstein, who famously had a chaotic desk. His disorganized space was the birthplace of revolutionary ideas like the theory of relativity.

If your desk is a pile of papers, books, sticky notes, and random objects, be proud.

It’s a sure sign you are up to something.

It simply means your creativity has captured your attention, and in that moment, everything else just doesn’t seem important.

2. Extremely Crazy Ideas

Do you often come up with ideas that make others raise their eyebrows and say, “That’s nuts!” “You’re crazy” “That’s never going to work”?

Fantastic!

Having “crazy” ideas is a sign of genius.

Take Elon Musk, the genius behind companies like SpaceX and Tesla. He’s known for his audacious ideas like colonizing Mars and revolutionizing transportation.

As a writer, it’s the innovative ideas that set you apart.

So, don’t dismiss those funky thoughts — they might just be the seeds of your genius stories.

3. Daydreaming is Your Gem

Do you often find yourself daydreaming and letting your mind wander into your imagination?

Sounds fantastic!

Daydreaming isn’t a sign of distraction; it’s a playground for your creative genius.

Take J.K. Rowling, the creator of the magical world of Harry Potter, for example. She often shared how her daydreams during her daily commute laid the foundation for her beloved books.

As a writer, those moments when you’re lost in your thoughts are the birthplace of your genius ideas.

Embrace them and always have your notebook handy to jot down those seemingly crazy ideas, and don’t be afraid to follow their callings.

Even if no one else can see the vision yet, you can.

4. Special Love for Complexity

Do you find joy in tackling complex puzzles, mysteries, or riddles that leave others scratching their heads?

Excellent news!

That’s another sign that you’re a genius.

Most people shy away from hard-to-understand topics, but that’s not you.

Think of Walt Disney, the creative mastermind behind beloved animated classics like ‘Snow White’ and ‘Cinderella.’ His ability to weave intricate stories and create magical worlds is proof of his love for complexity.

As a writer, your love for complexity can lead to intricate plot twists, layered character development, and awe-inspiring stories.

Don’t shy away from the intricate; it’s where your genius thrives.

5. Your Unique Perspective

If you see the world from a unique perspective that others don’t seem to grasp, that’s another sign you are a genius.

It’s like you have your own magical glasses through which you view the world, and that leads you to unconventional and groundbreaking ideas.

Steve Jobs, the co-founder of Apple, was renowned for his unique perspective on design and technology. His genius lay in combining aesthetics with functionality.

As a writer, your unique perspective can infuse fresh life into your stories and captivate your readers in unexplainable ways.

6. Curiosity at Its Max

Geniuses are extremely curious. Are you?

If so, that’s another sign you’re a genius.

Congratulations!

You ask questions, explore the unknown, and never stop seeking knowledge. It’s like you can never get enough information to feel satisfied with what you know.

Consider the insatiable curiosity of Leonardo da Vinci, the Renaissance polymath who explored various fields, from art and science to engineering. His quest for knowledge led to groundbreaking discoveries and brilliant artistic creations.

For writers, this trait is a treasure hunt for hidden knowledge you can share with the world, bringing authenticity to your stories.

7. Expert in Overcoming Life Challenges

The path to genius isn’t always a smooth ride. It’s marked by failures, setbacks, loneliness, and the eagerness to keep moving forward.

Does that sound like you?

Yes, you are a genius, even if it’s hard to believe sometimes.

Those challenges are designed specifically for you so that you can learn and grow like no other.

No matter what others think or say about your ideas, you go for it with an unshakable mindset.

No people, no places, no things can stop you from going after your vision.

Think of Thomas Edison, who invented the light bulb. He said, “I have not failed. I’ve just found 10,000 ways that won’t work.” — simply genius.

As a writer, your ability to persevere through rejections and obstacles is what will eventually lead to your genius work.

What do you think?

Which sign of genius do you resonate with most?

Feel free to highlight, clap, comment, and if you find this read valuable, consider subscribing and following for more thought-provoking messages.

If you’re feeling extra motivated, energized, and generous, you might want to buy me a coffee and support writers like me. We all know writers are underpaid. Thank you in advance! I’ll write my next story with your coffee right beside me.

P.S: Special shout out to these amazing souls who are continuously supporting my work, or recently started to follow. You may want to connect with them as well. Thank you… Jan Sebastian 🖐👩‍🦰 | Amy Grech | John Ang | Anna Soldenhoff | Seth Rock | Charmi Vyas | Loren Kantor | Oriana frostfern | Emil | ZHENA | Daniel Mayhugh | Daniel Mami | Kenta Tsushima | Janine | Alexandra Grosu | ✨ Bridget Webber | Justine Jacob | Obeaswan | Lee M Hush | Cafe Spiritualista | Lindsay Pena | Emeli Galvez | Reality in Motion.| Serenity Rivers | Andre Jean | Eric Agsulid-LeVoir | DJm | KourtneyNicoleWrites | Doc Nirvana: Compassionate Care | Martynas Ki. (@strangecash) |

Writing
Psychology
Self Improvement
Mental Health
Spirituality
Recommended from ReadMedium