Skip to content

Instantly share code, notes, and snippets.

@mrange
Created December 6, 2020 15:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrange/b2dfbafcb41b42fb59ba1a7d02bd396f to your computer and use it in GitHub Desktop.
Save mrange/b2dfbafcb41b42fb59ba1a7d02bd396f to your computer and use it in GitHub Desktop.
Testing ideas wrt to DI in F#
module Log =
open Printf
type LogLevel =
| Meltdown = 0b00000001
| Error = 0b00000010
| Warning = 0b00000100
| Info = 0b00001000
| Success = 0b00010000
type [<AbstractClass>] Logger =
class
abstract Log: LogLevel -> string -> unit
end
type ILogProvider =
interface
abstract Logger: Logger
end
let log (env : #ILogProvider) logLevel msg = env.Logger.Log logLevel msg
let meltdown env msg = log env LogLevel.Meltdown msg
let error env msg = log env LogLevel.Error msg
let warning env msg = log env LogLevel.Warning msg
let info env msg = log env LogLevel.Info msg
let success env msg = log env LogLevel.Success msg
let meltdownf env fmt = kprintf (meltdown env) fmt
let errorf env fmt = kprintf (error env) fmt
let warningf env fmt = kprintf (warning env) fmt
let infof env fmt = kprintf (info env) fmt
let successf env fmt = kprintf (success env) fmt
module Storage =
type [<AbstractClass>] Repository =
class
abstract Write: string -> 'T -> unit
abstract TryRead: string -> 'T option
end
type IRepositoryProvider =
interface
abstract Repository: Repository
end
let write (env : #IRepositoryProvider) id o =
env.Repository.Write id o
let tryRead (env : #IRepositoryProvider) id =
env.Repository.TryRead id
module MyModule =
open Log
open Storage
type User = {
Id : string
FirstName : string
LastName : string
}
let doStuff env =
try
info env "Starting up..."
match tryRead env "123" with
| Some (u : User) -> infof env "User: %A" u
| None -> warning env "No user!"
info env "Done!"
finally
error env "Oops!"
[<EntryPoint>]
let main argv =
printfn "Hello World from F#!"
0 // return an integer exit code
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment