module Decoder =
open System
let apply f x y =
match x, y with
| Some x, Some y ->
f x y
|> Some
| _ ->
None
let hexStringToNumber
(text: string) =
let getNumber =
function
| '0' ->
Some 0.0
| '1' ->
Some 1.0
| '2' ->
Some 2.0
| '3' ->
Some 3.0
| '4' ->
Some 4.0
| '5' ->
Some 5.0
| '6' ->
Some 6.0
| '7' ->
Some 7.0
| '8' ->
Some 8.0
| '9' ->
Some 9.0
| 'a' ->
Some 10.0
| 'b' ->
Some 11.0
| 'c' ->
Some 12.0
| 'd' ->
Some 13.0
| 'e' ->
Some 14.0
| 'f' ->
Some 15.0
let hexCharToNumber
power char =
char
|> getNumber
|> Option.map
(fun value ->
value
*
(16.0
**
float power))
text.ToCharArray()
|> Array.rev
|> Array.mapi
hexCharToNumber
|> Array.reduce
(apply (+))
type EncodedType =
| Url of string
| Utf8 of string
let private urlDecoder =
Uri.UnescapeDataString
let private utf8Decoder =
sprintf "%s"
let decode = function
| Url url ->
urlDecoder url
| Utf8 utf8 ->
utf8Decoder utf8
open Decoder
let input = "\
"
input
//|> Url |> decode
//|> Utf8 |> decode
|> printfn "%s"