Skip to content

Instantly share code, notes, and snippets.

View akhansari's full-sized avatar

Amin Khansari akhansari

View GitHub Profile
akhansari /
Last active December 21, 2021 10:11
My Useful Tools


  • firacode
  • windows-terminal
  • starship
  • gopass
  • pass-winmenu-nogpg
  • micro
  • nodejs
  • jq
akhansari / ConsulKv.fs
Last active August 18, 2021 15:08
Simple Consul KV client in F#
View ConsulKv.fs
module Helpers =
let rec (|NestedHttpRequestException|_|) (e: exn) =
match e with
| null -> None
| :? Net.Http.HttpRequestException as e -> Some e
| e -> (|NestedHttpRequestException|_|) e.InnerException
module ConsulKv =
akhansari / Notify.fs
Last active December 10, 2021 18:34
Bolero Bulma Notify/Toast Component
View Notify.fs
module Notify
open System
open Elmish
open Bolero
open Bolero.Html
type State = Opened | Closed
akhansari / flurl.fsx
Created March 15, 2021 14:54
F# Flurl
View flurl.fsx
#r "nuget: Flurl.Http"
module HttpApi =
open System
open System.Net
open System.Text.Json
open Flurl.Http
type Serializer (opt) =
interface Configuration.ISerializer with
akhansari / onion-1.fs
Last active February 22, 2023 16:51
F# : Onion architecture in a nutshell
View onion-1.fs
// 1. pure, don't think about IO at all
module Domain =
let add x y = x + y
// 2. think about IO but not its implementation
module App =
let add (getX: unit -> Async<int32>) y =
async {
let! x = getX ()
return Domain.add x y
akhansari / Program1-Minimal.fs
Last active September 9, 2023 13:33
F# : Different ways to create an API without a dependency
View Program1-Minimal.fs
open System
open Microsoft.AspNetCore.Builder
open Microsoft.AspNetCore.Http
open Microsoft.AspNetCore.Routing
type Item = { Id: int32; Name: string; Price: decimal }
let rnd = Random()
let getProducts () =
[ for _ in 1..3 do { Id = rnd.Next 100; Name = "Blueberry"; Price = 10m } ]
akhansari / event-sourced-user.fsx
Last active December 16, 2022 00:09
F# : Event Sourcing in a nutshell
View event-sourced-user.fsx
// ========= Event Sourcing in a nutshell
FriendlyName: string
Aggregate friendly name.
Initial: 'State
Initial (empty) state we will start with.
Decide: 'Command -> 'State -> 'Event list
akhansari /
Created October 28, 2019 17:11 — forked from swlaschin/
Effective F#, tips and tricks


  • Use Onion architecture

    • Dependencies go inwards. That is, the Core domain doesn't know about outside layers
  • Use pipeline model to implement workflows/use-cases/stories

    • Business logic makes decisions
    • IO does storage with minimal logic
    • Keep Business logic and IO separate
  • Keep IO at edges

akhansari / tasks.json
Created February 28, 2018 00:23
VSCode task for Hugo with error detection.
View tasks.json
"version": "2.0.0",
"tasks": [
"label": "Hugo",
"type": "shell",
"command": "hugo serve",
"group": "build",
"isBackground": true,
"problemMatcher": {
akhansari /
Last active December 15, 2017 23:49
Guidelines and rules for GetHashCode

Guidelines and rules for GetHashCode

What is GetHashCode used for?

It is by design useful for only one thing: putting an object in a hash table. Hence the name.

Why do we have this method on Object in the first place?

It makes perfect sense that every object in the type system should provide a GetType method; data's ability to describe itself is a key feature of the CLR type system. And it makes sense that every object should have a ToString, so that it is able to print out a representation of itself as a string, for debugging purposes. It seems plausible that objects should be able to compare themselves to other objects for equality. But why should it be the case that every object should be able to hash itself for insertion into a hash table? Seems like an odd thing to require every object to be able to do.