Skip to content

Instantly share code, notes, and snippets.

View davidgrenier's full-sized avatar

David Grenier davidgrenier

View GitHub Profile
let rec fibf = Seq.cache <| seq {
yield! [1I; 1I]
yield! Seq.map2 (+) fibf (Seq.skip 1 fibf)
};;
fibf |> Seq.nth 100000
@davidgrenier
davidgrenier / Euler05.fsx
Created August 22, 2011 17:35
Project Euler 5
let getPrimeFactors n =
let allFactors = seq { yield 2; yield! Seq.initInfinite (fun i -> 2 * i + 3) } |> Seq.cache
let addFactor factors d =
match Map.tryFind d factors with
| None -> Map.add d 1 factors
| Some count -> Map.remove d factors |> Map.add d (count + 1)
let rec gPF n factors =
allFactors
|> Seq.takeWhile (fun d -> d <= (n |> float |> sqrt |> int))
|> Seq.tryFind (fun d -> n % d = 0)
@davidgrenier
davidgrenier / limiter.fs
Created November 18, 2011 22:31
Task limiter
open System
type IParallelLimiter =
abstract GetToken : unit -> Async<IDisposable>
type Message=
| GetToken of AsyncReplyChannel<IDisposable>
| Release
let start count =
@davidgrenier
davidgrenier / ActivePatternComparison.fs
Created November 21, 2011 14:24
NegativePositiveZero
let (|Negative|Positive|Zero|) x =
if x > 0 then Positive
else if x < 0 then Negative
else Zero
let count = -2;;
match count with
| Zero | Negative -> printfn "Zero or less"
| Positive -> printfn "Greater than zero"
@davidgrenier
davidgrenier / AsyncGetResponseFix.fs
Created November 21, 2011 20:29
Catching async request timeout
open System
open System.IO
open System.Net
type Request = Request of WebRequest * AsyncReplyChannel<WebResponse>
let requestAgent =
MailboxProcessor.Start <| fun inbox -> async {
while true do
let! (Request (req, port)) = inbox.Receive ()
@davidgrenier
davidgrenier / caught.fs
Created November 25, 2011 02:57
ExceptionCaught
let fn () = failwith "Test";;
async {
try
fn ()
with e -> printfn "Catched %A" e
} |> Async.RunSynchronously
@davidgrenier
davidgrenier / EqId.fs
Created December 2, 2011 15:45
Id&Equals Active patterns
let (|Equals|_|) x y =
if x = y then Some () else None
let (|Id|_|) f x =
if f x then Some () else None
let a = 3;;
match 3 with
| Equals a -> "Yes"
@davidgrenier
davidgrenier / PatternVsIf.fs
Created December 2, 2011 16:14
Pattern > If example
type Status = Active | Standby | Inactive
let status = Active
let isOnline = true
if not isOnline then
printfn "Status is offline or inactive"
else
match status with
| Active -> "Status is active"
@davidgrenier
davidgrenier / form.fs
Created January 5, 2012 18:53
Quick form
#r "System.Windows.Forms"
open System.Windows.Forms
let form = new Form (Visible = true, TopMost = true)
let button = new Button()
form.Controls.Add button
button.Click.Add <| (fun _ -> MessageBox.Show "Hello" |> ignore)
@davidgrenier
davidgrenier / PostAndAsyncReply.fs
Created February 8, 2012 02:00
PostAndAsyncReply
type MessageWithResponse =
| GetNextNumber of AsyncReplyChannel<int> * int
let inbox =
MailboxProcessor.Start <| fun inbox ->
async {
while true do
let! (GetNextNumber(channel, num)) = inbox.Receive()
channel.Reply (num + 1)
};;