Skip to content

Instantly share code, notes, and snippets.

View Szer's full-sized avatar

Ayrat Hudaygulov Szer

View GitHub Profile
type StreamCons<'a> =
| Nil
| Cons of 'a * Stream<'a>
and Stream<'a> = Lazy<StreamCons<'a>>
let inline force (l: Lazy<_>) = l.Force()
let rec toStream l : Stream<_> =
lazy match l with
| [] -> Nil
@Szer
Szer / codegen.fs
Created February 24, 2019 12:17
CodeGen For F#
#r @"C:\Users\User\.nuget\packages\fsharp.compiler.service\25.0.1\lib\net45\FSharp.Compiler.Service.dll"
open System.Text
open Microsoft.FSharp.Compiler.Ast
open Microsoft.FSharp.Compiler.Range
open Microsoft.FSharp.Compiler.SourceCodeServices
//PARSING
let parse text =
@Szer
Szer / code-gen2.fs
Created February 26, 2019 17:18
Generate type serialization tests because I'm lazy
#r @"C:\Users\ayrat.hudaygulov\.nuget\packages\fsharp.compiler.service\26.0.1\lib\net45\FSharp.Compiler.Service.dll"
open System.IO
open Microsoft.FSharp.Compiler.Ast
open Microsoft.FSharp.Compiler.SourceCodeServices
let parse text =
let fileName = "whatever.fs"
let checker = FSharpChecker.Create()
let opts =
@Szer
Szer / git-cleanup.ps1
Last active March 1, 2019 12:02
Deleting old remote branches which have been merged into master
function CleanupRepo {
param([string]$repo)
<#work directory should be repo root#>
cd $repo
git fetch "origin"
git reset --hard origin/master
"getting branch list..."
interface IJsonFormatter<byte[]> with
member __.Serialize(writer, value, formatterResolver) =
if value = null then writer.WriteNull()
else
writer.WriteRaw value
//This is very convoluted way of escaping non-escaped strings from verbatim UTF8 string as byte array
member __.Deserialize(reader, formatterResolver) =
if reader.ReadIsNull() then null else
@Szer
Szer / tag-cleanup.ps1
Last active May 13, 2019 11:42
Tag cleanup
function CleanupTags {
param([string]$repo)
<#work directory should be repo root#>
cd $repo
git fetch "origin"
git reset --hard origin/master
"getting tags list..."
@Szer
Szer / bench.fs
Created June 25, 2019 09:41
spawn task vs spawn jobs bench
open BenchmarkDotNet.Attributes
open BenchmarkDotNet.Running
open Hopac
[<SimpleJob(launchCount = 3, warmupCount = 3, targetCount = 5)>]
[<GcServer(true)>]
[<MemoryDiagnoser>]
type Benchs() =
[<Benchmark>]
@Szer
Szer / inline.fs
Last active December 17, 2019 15:21
Inline proposal
// not inlined GENERIC function
let bar x = printfn "%A" x
// CASE 1. Usual function. impossible now and that's OK
let foo (f: 'a -> unit) = // 'a is inferred as string
f "" // warning here. generic is not generic!
f 1 // compile error
//calling site before inline
foo bar
//calling site after inline
@Szer
Szer / printdu.fs
Last active December 17, 2019 17:16
Pretty printing DU recursively
open System.Text
open Microsoft.FSharp.Reflection
let printDu du =
let rec inner (builder: StringBuilder, duValue: obj, duType: Type) =
if not (FSharpType.IsUnion duType) then failwith "FU!"
let case, values = FSharpValue.GetUnionFields(duValue, duType)
@Szer
Szer / nested_ce.fs
Last active July 27, 2020 21:05
Nested CE
type ThirdLevel =
| Payload of int
and SecondLevel =
| Nested of ThirdLevel list
| Payload of string
and FirstLevel =
| Nested of SecondLevel list
| Payload of double
| EmptyLine
and AllBuilder() =