fork(1) download
  1. let inline project projection value = projection value, value
  2. let projectToMap projection values = values |> Seq.map (project projection) |> Map.ofSeq
  3.  
  4. type XYZ = { X:int; Y:string; Z:float }
  5. let xyzs = [{ X=3; Y="B"; Z=30.0 }
  6. { X=2; Y="A"; Z=10.0 }
  7. { X=1; Y="b"; Z=20.0 }
  8. { X=4; Y="a"; Z=20.0 }]
  9.  
  10. // just for demo purposes
  11. let printXyzMap m =
  12. m |> Map.iter (fun k { X=x; Y=y; Z=z } -> printfn "\t%A :: { X=%A; Y=%A; Z=%A }" k x y z)
  13.  
  14. stdout.WriteLine "by X:"
  15. xyzs |> projectToMap (fun { X=x } -> x) |> printXyzMap
  16.  
  17. stdout.WriteLine "by Y:"
  18. xyzs |> projectToMap (fun { Y=y } -> y) |> printXyzMap
  19.  
  20. stdout.WriteLine "by Z,Y:"
  21. xyzs |> projectToMap (fun { Y=y; Z=z } -> z, y) |> printXyzMap
Success #stdin #stdout 0.22s 25576KB
stdin
Standard input is empty
stdout
by X:
	1 :: { X=1; Y="b"; Z=20.0 }
	2 :: { X=2; Y="A"; Z=10.0 }
	3 :: { X=3; Y="B"; Z=30.0 }
	4 :: { X=4; Y="a"; Z=20.0 }
by Y:
	"A" :: { X=2; Y="A"; Z=10.0 }
	"B" :: { X=3; Y="B"; Z=30.0 }
	"a" :: { X=4; Y="a"; Z=20.0 }
	"b" :: { X=1; Y="b"; Z=20.0 }
by Z,Y:
	(10.0, "A") :: { X=2; Y="A"; Z=10.0 }
	(20.0, "a") :: { X=4; Y="a"; Z=20.0 }
	(20.0, "b") :: { X=1; Y="b"; Z=20.0 }
	(30.0, "B") :: { X=3; Y="B"; Z=30.0 }