Code Snippet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| module Standard =
let (@@) : ('a -> 'b option) -> ('a -> 'b option) -> 'a -> 'b option =
fun f g x ->
match f x with
| None -> g x
| some -> some
let standard : string -> string option = function
| ".txt" -> Some "text/plain"
| ______ -> None
type config =
{ mimeTypes : string -> string option }
let patternMatch : string -> config -> string option =
fun x { config.mimeTypes = f } ->
f x
let config = { mimeTypes = standard }
module Custom =
open Standard
let extended : string -> string option = function
| ".avi" -> Some "video/avi"
| ______ -> None
let custom = standard @@ extended
let config = { config with mimeTypes = custom }
Standard . config |> Standard . patternMatch ".avi"
Custom . config |> Standard . patternMatch ".avi"
|
Code output:
>
module Standard = begin
val ( @@ ) : f:('a -> 'b option) -> g:('a -> 'b option) -> x:'a -> 'b option
val standard : _arg1:string -> string option
type config =
{mimeTypes: string -> string option;}
val patternMatch : x:string -> config -> string option
val config : config = {mimeTypes = <fun:config@19>;}
end
>
module Custom = begin
val extended : _arg1:string -> string option
val custom : (string -> string option)
val config : Standard.config = {mimeTypes = <fun:custom@28-2>;}
end
> val it : string option = None
> val it : string option = Some "video/avi"
References:
- Suave.IO:
- Suave.IO @ GitHub: