git "$@"
if [ $# -gt 0 ]
View FsAdvent.fsx
#r @"..\packages\FSharp.Data\lib\net40\FSharp.Data.dll"
open FSharp.Data
let OverviewUrl = @""
type Page = HtmlProvider<OverviewUrl>
View Prelude.fsx
open System
let asFst second first = first, second
let asSnd first second = first, second
let swap (a, b) = b, a
type FullJoinResult<'TLeft, 'TRight> =
| LeftOnly of 'TLeft
| RightOnly of 'TRight
View ArguInteropExample.fsx
open Argu
type CliArguments =
| Yes
| Name of string
| Value of int
with interface IArgParserTemplate with
member s.Usage =
match s with
| Yes -> "specify"
View Fsharp.ahk
; In case you think you may need Caps Lock again at some point,
; we'll move it over to Win+Caps Lock
SetCapsLockState, AlwaysOff
If GetKeyState("CapsLock", "T") = 1
SetCapsLockState, AlwaysOff
View VSExtensions.txt
Provides a toolbar dropdown box to switch between startup projects. -- VS 2015 has that too, but that doesn't recognize F# projects
Productivity Power Tools 2015
Color coded document tabs by file extension or project, various information in the scroll bar, column guides, etc.
Augments Visual Studio's built-in difference viewer with 'from' and 'to' revision sliders. Accessible from the 'Tools' menu, CodeLineage allows easy access to a cumulative diff view between file revisions. Supports SVN, Perforce, Git and Mercurial.
View UpdateExercismProject.fsx
I am using Visual Studio to solve the F# problems on, and I found it tedious
to always add the same files (test file, new code file, readme, plus a folder for better
organization) after each `exercism fetch`, so I automated that.
As it is, this assumes that the .fsproj file is in `exercism\fsharp`. When run, it compares
the subdirectories present with the folders in the .fsproj file, and for any that are
missing in the project file, it adds the `*Test(s).fs` and `` files as well as
creating a new .fs file for the problem solution. It also adds a `module` line with the
respective file name (which is correct most of the time; only occasionally, the module the
View NestedLets.fs
// old
let ComposeSimple serviceProvider configuration =
let (context, organizationService, _, _) = DecomposeServiceProvider serviceProvider
let configurationXml = XElement.Parse configuration
let getRecordName = GetRecordName organizationService
let regardingLookups() = ConfiguredRegardingLookups configurationXml
let listFindingRegardingObject() = ListFindingRegardingObject regardingLookups (GetFullRecordImage(context))
let regardingObject = NameAddedRegardingObject getRecordName listFindingRegardingObject
View QueryByAttribute to QueryExpression
// This....
QueryByAttribute qba = new QueryByAttribute("entityName")
ColumnSet = new ColumnSet("fieldA", "fieldB")
// There may be several of these lines
qba.AddAttributeValue("fieldC", "fieldCValue");

As requested by several people on Twitter after I mentioned that the C# implementation is 27 lines, and the F# version saves only two lines over this (which is mainly because there isn't much to save at all). In the mean time, I actually managed to shave off two more lines because the last method call incidentally returns void.

Please note that the plugin as such is not very useful; I'm mainly trying to get an F# plugin to run within MSCRM in the first place.


	using Microsoft.Xrm.Sdk;
	using System;