avatarJamie Golob

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>

Spirituality

Why Shiva Lingam Have Earned the Title of God Stone

Awakening Kundalini

Image compliments of the author Jamie Golob

Deep within the Narmada River in Westen India, one of India’s most holy of sites, lies a mystical treasure trove.

Within the Indian Hindu religion, shiva lingam are a sacred stone. Found exclusively at the bottom of the Narmada River, they are associated with the Hindu God Shiva. Within ancient Hindu tradition, it’s believed the Goddess Parvati hand-shaped a Shiva Lingam out of the sand, to represent both the divine male and female energies using it to worship Lord Shiva.

Shiva Lingam stones are a distinctive elongated egg shape thought to represent the cosmic egg of which all life has sprung. The name Lingam s translated from Sanskrit word linga meaning symbol.

Magical ingredients

Shiva lingam are considered to be crystals. The stewy bed of the Narmada river is said to be riddled with the microscopic debris of a crashed meteorite touching down over 14 million years ago. The entire river, not only the stones, is considered to have healing attributes. Many from around the world make a Pilgrimage to the river in hopes of benefiting from its powers.

Shiva Lingam stones are Cryptocrystalline Quartz combined with Iron Oxide deposits and a mixture of Chalcedony, Agate, Basalt, and Jasper. They come in all many sizes and are especially sought out by Shaman and healers. Considered to be one of the most powerful of stones, Shiva Lingams have an incredibly strong connection to the original creation, giving them a powerful resonation with all elements including earth, wind, fire, and water.

Image compliments of the author Jamie Golob

Caring for a shiva lingam

As with any other crystal, Shiva Lingam need to be cleansed and charged regularly. The first of these stones I purchased was intended for use in my Reiki sessions. Very quickly it proved itself to be a stone of extremely high vibration. Many Reiki practitioners consider this to be a superior stone when working on fertility issues. The energy I felt coming off the shiva lingam was almost tangible. After sessions that employ my shiva lingam, I use selenite bars to cradle it, cleansing and restoring its energy. I display it daily in my home and move it from room to as I see fit. It’s a wonderful stone for adding peace and harmony to any space it resides in.

Through the eyes of animals

We hear about the energies and vibrations embodied in crystals and stones, but sometimes it’s difficult to truly grasp the reality of it. After all, seeing is believing. If we can’t see something with our own eyes we assume it doesn’t exist. Consider this story.

When I first brought my Texas Heeler puppies home, they were sweet, innocent bundles of fluffy goodness. They loved to rumble about the living room rug playing tug of war with their knotted chew toy. One evening I noticed they were sitting quietly looking up at my cabinet across the room. They were staring at my shiva lingam stone. Their ears were perked up as they silently sat. Intrigued, I placed the large stone in the center of the rug for them to investigate. The stone was literally as big as they were at the time.

What happened next sent chills up my spine.

Both puppies huddled around the stone almost as if they wanted to be absorbed into it. Each of them feverishly rubbed their cheeks against the sides of the stone. Their soft whimpers slowly grew into desperate whining. They began pawing at the stone, digging and trying to open it up. Suddenly one of them mustered up a howl! I was floored. What could I say or do? They were obviously seeing and experiencing something that I had no explanation for. I was forced to not only take the stone away but to temporarily hide it away in another room.

Image compliments of the author Jamie Golob

4 interesting attributes of the shiva lingam

1- The ability to not only cool the human body but to quickly absorb and redistribute heat as well.

2- The ability to immediately begin activating kundalini energy.

3- The ability to activate all of the chakras super boosting prana and vitality.

4- The ability to aid in the following ailments including depression, infertility, pregnancy, impotence, prostate disorders, reproductive organs, and vitality.

“Fall in love with taking care of yourself. Fall in love with the path of deep healing. Fall in love with becoming the best version of yourself but with patience, with compassion and respect to your own journey.”

— s. Mcnutt

Shiva lingam awakens kundalini

Kundalini, in Hinduism, is a form of divine feminine energy and consciousness believed to be coiled at the base of the spine. Kundalini is the source of our life force or chi. Kundalini can uncoil like a snake either gradually or explosively and is triggered by spiritual practices or life events. This type of spiritual awakening can be jarring and chaotic for those not ready for the experience. However, many aim for this as it’s considered the path to spiritual enlightenment. Awakening the kundalini energy offers the potential to radically shift one's negative patterns and delusions of a separate self.

Shiva lingam stones are one of the most powerful stones used for awakening kundalini energy through meditation and energy work. If you feel yourself drawn to a shiva lingam, you know it’s time for you to begin a deeper more focused path of realization and enlightenment.

Welcoming a shiva lingam into your life

If you’d like to acquire one of these incredible stones you’ll want to be sure you research the shop you purchase from. Be sure you are purchasing an authentic article from a reputable dealer in genuine crystals. Shiva lingam are more challenging to come by than most other crystals, but not impossible to find. Shiva lingam are a wonderful addition to any crystal collection and it’s my hope that you'll consider exploring what these sacred stones have to offer.

My name is Jamie Golob. I’m a writer, artist, Reiki practitioner, and lover of life, motivated by the collective experiences and stories of the creative community. My mission is to illuminate and preserve the beautiful complexities of what it means to be human. Subscribe to my monthly newsletter Living Wanderfully for tons of great freebies!

If you enjoyed reading this article you may also like:

Spirituality
Spiritual Growth
Meditation
Mindfulness
Self-awareness
Recommended from ReadMedium