Add to cart
To implement App handler, we need the following Db module functions:
Db.fs
| 86: 87: 88: 89: 90: 91: | 
 | 
Db.fs
| 93: 94: 95: 96: 97: 98: 99: | 
 | 
addToCart takes cartId and albumId. 
If there's already such cart entry in the database, we do increment the Count column, otherwise we create a new row.
To check if a cart entry exists in database, we use getCart - it does a standard lookup on the cartId and albumId.
Now open up the View module and find the details function to append a new button "Add to cart", at the very bottom of "album-details" div:
View.fs
| 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: | 
 | 
With above in place, we're ready to define the handler in App module:
App.fs
| 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: | 
 | 
App.fs
|  235: 
 | 
 | 
addToCart invokes our session function with two flavors:
- if NoSessionthen create a new GUID, save the record in database and update the session store with "cartid" key
- if UserLoggedOnorCartIdOnlythen only add the album to the user's cart. Note that we could bind thecartIdstring value here to both cases - as described earliercartIdequals GUID if user is not logged on, otherwise it's the user's name.Multiple items
 namespace FSharp
 --------------------
 namespace Microsoft.FSharpMultiple items
 namespace FSharp.Data
 --------------------
 namespace Microsoft.FSharp.Datanamespace FSharp.Data.SqlMultiple items
 type LiteralAttribute =
 inherit Attribute
 new : unit -> LiteralAttribute
 Full name: Microsoft.FSharp.Core.LiteralAttribute
 --------------------
 new : unit -> LiteralAttributeval ConnectionString : string
 Full name: SuaveMusicStore.Db.ConnectionStringtype Sql = SqlDataProvider<...>
 Full name: SuaveMusicStore.Db.Sqltype SqlDataProvider
 Full name: FSharp.Data.Sql.SqlDataProvider
 <summary>Typed representation of a database</summary>
 <param name='ConnectionString'>The connection string for the SQL database</param>
 <param name='ConnectionStringName'>The connection string name to select from a configuration file</param>
 <param name='DatabaseVendor'> The target database vendor</param>
 <param name='IndividualsAmount'>The amount of sample entities to project into the type system for each SQL entity type. Default 1000.</param>
 <param name='UseOptionTypes'>If true, F# option types will be used in place of nullable database columns. If false, you will always receive the default value of the column's type even if it is null in the database.</param>
 <param name='ResolutionPath'>The location to look for dynamically loaded assemblies containing database vendor specific connections and custom types.</param>
 <param name='Owner'>The owner of the schema for this provider to resolve (Oracle Only)</param>
 <param name='CaseSensitivityChange'>Should we do ToUpper or ToLower when generating table names?</param>
 <param name='TableNames'>Comma separated table names list to limit a number of tables in big instances. The names can have '%' sign to handle it as in the 'LIKE' query (Oracle and MSSQL Only)</param>
 <param name='OdbcQuote'>Odbc quote characters: Quote characters for the table and column names: `alias`, [alias]</param>
 <param name='SQLiteLibrary'>Use System.Data.SQLite or Mono.Data.SQLite or select automatically (SQLite only)</param>
 namespace FSharp.Data.Sql.Commontype DatabaseProviderTypes =
 | MSSQLSERVER = 0
 | SQLITE = 1
 | POSTGRESQL = 2
 | MYSQL = 3
 | ORACLE = 4
 | MSACCESS = 5
 | ODBC = 6
 | FIREBIRD = 7
 Full name: FSharp.Data.Sql.Common.DatabaseProviderTypesCommon.DatabaseProviderTypes.POSTGRESQL: Common.DatabaseProviderTypes = 2type CaseSensitivityChange =
 | ORIGINAL = 0
 | TOUPPER = 1
 | TOLOWER = 2
 Full name: FSharp.Data.Sql.Common.CaseSensitivityChangeCommon.CaseSensitivityChange.ORIGINAL: Common.CaseSensitivityChange = 0type DbContext = SqlDataProvider<...>.dataContext
 Full name: SuaveMusicStore.Db.DbContexttype dataContext =
 member ClearUpdates : unit -> List<SqlEntity>
 member CreateConnection : unit -> IDbConnection
 member GetUpdates : unit -> List<SqlEntity>
 member Public : publicSchema
 member SubmitUpdates : unit -> Unit
 member SubmitUpdatesAsync : unit -> Async<Unit>
 nested type public.albumdetails.Individuals
 nested type public.albumdetailsEntity
 nested type public.albums.Individuals
 nested type public.albumsEntity
 ...
 Full name: FSharp.Data.Sql.SqlDataProvider,DatabaseVendor="2",ConnectionString="Server=192.168.99.100;Database=suavemusicstore;User Id=suave;Password=1234;",CaseSensitivityChange="0".dataContexttype Album = SqlDataProvider<...>.dataContext.public.albumsEntity
 Full name: SuaveMusicStore.Db.Albumtype Genre = SqlDataProvider<...>.dataContext.public.genresEntity
 Full name: SuaveMusicStore.Db.Genretype AlbumDetails = SqlDataProvider<...>.dataContext.public.albumdetailsEntity
 Full name: SuaveMusicStore.Db.AlbumDetailstype Artist = SqlDataProvider<...>.dataContext.public.artistsEntity
 Full name: SuaveMusicStore.Db.Artisttype User = SqlDataProvider<...>.dataContext.public.usersEntity
 Full name: SuaveMusicStore.Db.Usertype CartDetails = SqlDataProvider<...>.dataContext.public.cartdetailsEntity
 Full name: SuaveMusicStore.Db.CartDetailstype Cart = SqlDataProvider<...>.dataContext.public.cartsEntity
 Full name: SuaveMusicStore.Db.Cartval getContext : unit -> SqlDataProvider<...>.dataContext
 Full name: SuaveMusicStore.Db.getContextSqlDataProvider<...>.GetDataContext() : SqlDataProvider<...>.dataContext
 <summary>Returns an instance of the SQL Provider using the static parameters</summary>
 SqlDataProvider<...>.GetDataContext(transactionOptions: Transactions.TransactionOptions) : SqlDataProvider<...>.dataContext
 <summary>Returns an instance of the SQL Provider</summary>
 <param name='transactionOptions'>TransactionOptions for the transaction created on SubmitChanges.</param>
 SqlDataProvider<...>.GetDataContext(connectionString: string) : SqlDataProvider<...>.dataContext
 <summary>Returns an instance of the SQL Provider</summary>
 <param name='connectionString'>The database connection string</param>
 SqlDataProvider<...>.GetDataContext(connectionString: string, transactionOptions: Transactions.TransactionOptions) : SqlDataProvider<...>.dataContext
 <summary>Returns an instance of the SQL Provider</summary>
 <param name='connectionString'>The database connection string</param>
 <param name='transactionOptions'>TransactionOptions for the transaction created on SubmitChanges.</param>
 SqlDataProvider<...>.GetDataContext(connectionString: string, resolutionPath: string) : SqlDataProvider<...>.dataContext
 <summary>Returns an instance of the SQL Provider</summary>
 <param name='connectionString'>The database connection string</param>
 <param name='resolutionPath'>The location to look for dynamically loaded assemblies containing database vendor specific connections and custom types</param>
 SqlDataProvider<...>.GetDataContext(connectionString: string, resolutionPath: string, transactionOptions: Transactions.TransactionOptions) : SqlDataProvider<...>.dataContext
 <summary>Returns an instance of the SQL Provider</summary>
 <param name='connectionString'>The database connection string</param>
 <param name='resolutionPath'>The location to look for dynamically loaded assemblies containing database vendor specific connections and custom types</param>
 <param name='transactionOptions'>TransactionOptions for the transaction created on SubmitChanges.</param>val getGenres : ctx:DbContext -> Genre list
 Full name: SuaveMusicStore.Db.getGenresval ctx : DbContexttype 'T list = List<'T>
 Full name: Microsoft.FSharp.Collections.list<_>property SqlDataProvider<...>.dataContext.Public: SqlDataProvider<...>.dataContext.publicSchemaproperty SqlDataProvider<...>.dataContext.publicSchema.Genres: SqlDataProvider<...>.dataContext.publicSchema.public.genres
 <summary> The base table genres belonging to schema public</summary>Multiple items
 module Seq
 from FSharp.Data.Sql
 --------------------
 module Seq
 from Microsoft.FSharp.Collectionsval toList : source:seq<'T> -> 'T list
 Full name: Microsoft.FSharp.Collections.Seq.toListval getAlbumsForGenre : genreName:string -> ctx:DbContext -> Album list
 Full name: SuaveMusicStore.Db.getAlbumsForGenreval genreName : stringval query : Linq.QueryBuilder
 Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.queryval album : SqlDataProvider<...>.dataContext.public.albumsEntityproperty SqlDataProvider<...>.dataContext.publicSchema.Albums: SqlDataProvider<...>.dataContext.publicSchema.public.albums
 <summary> The base table albums belonging to schema public</summary>custom operation: join var in collection on (outerKey = innerKey). Note that parentheses are required after 'on'
 Calls Linq.QueryBuilder.Joinval genre : SqlDataProvider<...>.dataContext.public.genresEntityproperty SqlDataProvider<...>.dataContext.public.genresEntity.Genreid: int
 <summary> integer</summary>custom operation: where (bool)
 Calls Linq.QueryBuilder.Whereproperty SqlDataProvider<...>.dataContext.public.genresEntity.Name: string
 <summary> character varying(120)</summary>custom operation: select ('Result)
 Calls Linq.QueryBuilder.Selectval getAlbumDetails : id:int -> ctx:DbContext -> AlbumDetails option
 Full name: SuaveMusicStore.Db.getAlbumDetailsval id : inttype 'T option = Option<'T>
 Full name: Microsoft.FSharp.Core.option<_>val album : SqlDataProvider<...>.dataContext.public.albumdetailsEntityproperty SqlDataProvider<...>.dataContext.publicSchema.Albumdetails: SqlDataProvider<...>.dataContext.publicSchema.public.albumdetails
 <summary> The view albumdetails belonging to schema public</summary>property SqlDataProvider<...>.dataContext.public.albumdetailsEntity.Albumid: int
 <summary> integer</summary>val tryHead : source:seq<'T> -> 'T option
 Full name: Microsoft.FSharp.Collections.Seq.tryHeadval getAlbumsDetails : ctx:DbContext -> AlbumDetails list
 Full name: SuaveMusicStore.Db.getAlbumsDetailsMultiple items
 module List
 from FSharp.Data.Sql
 --------------------
 module List
 from Microsoft.FSharp.Collections
 --------------------
 type List<'T> =
 | ( [] )
 | ( :: ) of Head: 'T * Tail: 'T list
 interface IEnumerable
 interface IEnumerable<'T>
 member GetSlice : startIndex:int option * endIndex:int option -> 'T list
 member Head : 'T
 member IsEmpty : bool
 member Item : index:int -> 'T with get
 member Length : int
 member Tail : 'T list
 static member Cons : head:'T * tail:'T list -> 'T list
 static member Empty : 'T list
 Full name: Microsoft.FSharp.Collections.List<_>val sortBy : projection:('T -> 'Key) -> list:'T list -> 'T list (requires comparison)
 Full name: Microsoft.FSharp.Collections.List.sortByval a : SqlDataProvider<...>.dataContext.public.albumdetailsEntityproperty SqlDataProvider<...>.dataContext.public.albumdetailsEntity.Artist: string
 <summary> character varying(120)</summary>val getAlbum : id:int -> ctx:DbContext -> Album option
 Full name: SuaveMusicStore.Db.getAlbumproperty SqlDataProvider<...>.dataContext.public.albumsEntity.Albumid: int
 <summary> integer</summary>val deleteAlbum : album:Album -> ctx:DbContext -> Unit
 Full name: SuaveMusicStore.Db.deleteAlbumval album : Albummember Common.SqlEntity.Delete : unit -> unitSqlDataProvider<...>.dataContext.SubmitUpdates() : Unit
 <summary>Save changes to data-source. May throws errors: To deal with non-saved items use GetUpdates() and ClearUpdates().</summary>val getArtists : ctx:DbContext -> Artist list
 Full name: SuaveMusicStore.Db.getArtistsproperty SqlDataProvider<...>.dataContext.publicSchema.Artists: SqlDataProvider<...>.dataContext.publicSchema.public.artists
 <summary> The base table artists belonging to schema public</summary>val createAlbum : artistId:int * genreId:int * price:decimal * title:string -> ctx:DbContext -> Unit
 Full name: SuaveMusicStore.Db.createAlbumval artistId : intval genreId : intval price : decimalval title : stringSqlDataProvider<...>.dataContext.publicSchema.public.albums.Create() : SqlDataProvider<...>.dataContext.public.albumsEntity
 SqlDataProvider<...>.dataContext.publicSchema.public.albums.Create(data: System.Collections.Generic.IEnumerable<string * obj>) : SqlDataProvider<...>.dataContext.public.albumsEntity
 <summary>Item array of database columns:
 artistid,genreid,price,title</summary>
 SqlDataProvider<...>.dataContext.publicSchema.public.albums.Create(artistid: int, genreid: int, price: decimal, title: string) : SqlDataProvider<...>.dataContext.public.albumsEntityval ignore : value:'T -> unit
 Full name: Microsoft.FSharp.Core.Operators.ignoreval updateAlbum : album:Album -> artistId:int * genreId:int * price:decimal * title:string -> ctx:DbContext -> Unit
 Full name: SuaveMusicStore.Db.updateAlbumproperty SqlDataProvider<...>.dataContext.public.albumsEntity.Artistid: int
 <summary> integer</summary>property SqlDataProvider<...>.dataContext.public.albumsEntity.Genreid: int
 <summary> integer</summary>property SqlDataProvider<...>.dataContext.public.albumsEntity.Price: decimal
 <summary> numeric</summary>property SqlDataProvider<...>.dataContext.public.albumsEntity.Title: string
 <summary> character varying(160)</summary>val validateUser : username:string * password:string -> ctx:DbContext -> User option
 Full name: SuaveMusicStore.Db.validateUserval username : stringval password : stringval user : SqlDataProvider<...>.dataContext.public.usersEntityproperty SqlDataProvider<...>.dataContext.publicSchema.Users: SqlDataProvider<...>.dataContext.publicSchema.public.users
 <summary> The base table users belonging to schema public</summary>property SqlDataProvider<...>.dataContext.public.usersEntity.Username: string
 <summary> character varying(200)</summary>property SqlDataProvider<...>.dataContext.public.usersEntity.Password: string
 <summary> character varying(200)</summary>val getCart : cartId:string -> albumId:int -> ctx:DbContext -> Cart option
 Full name: SuaveMusicStore.Db.getCartval cartId : stringval albumId : intval cart : SqlDataProvider<...>.dataContext.public.cartsEntityproperty SqlDataProvider<...>.dataContext.publicSchema.Carts: SqlDataProvider<...>.dataContext.publicSchema.public.carts
 <summary> The base table carts belonging to schema public</summary>property SqlDataProvider<...>.dataContext.public.cartsEntity.Cartid: string
 <summary> character varying(50)</summary>property SqlDataProvider<...>.dataContext.public.cartsEntity.Albumid: int
 <summary> integer</summary>val addToCart : cartId:string -> albumId:int -> ctx:DbContext -> Unit
 Full name: SuaveMusicStore.Db.addToCartunion case Option.Some: Value: 'T -> Option<'T>val cart : Cartproperty SqlDataProvider<...>.dataContext.public.cartsEntity.Count: int
 <summary> integer</summary>union case Option.None: Option<'T>SqlDataProvider<...>.dataContext.publicSchema.public.carts.Create() : SqlDataProvider<...>.dataContext.public.cartsEntity
 SqlDataProvider<...>.dataContext.publicSchema.public.carts.Create(data: System.Collections.Generic.IEnumerable<string * obj>) : SqlDataProvider<...>.dataContext.public.cartsEntity
 <summary>Item array of database columns:
 albumid,cartid,count,datecreated</summary>
 SqlDataProvider<...>.dataContext.publicSchema.public.carts.Create(albumid: int, cartid: string, count: int, datecreated: System.DateTime) : SqlDataProvider<...>.dataContext.public.cartsEntitynamespace SystemMultiple items
 type DateTime =
 struct
 new : ticks:int64 -> DateTime + 10 overloads
 member Add : value:TimeSpan -> DateTime
 member AddDays : value:float -> DateTime
 member AddHours : value:float -> DateTime
 member AddMilliseconds : value:float -> DateTime
 member AddMinutes : value:float -> DateTime
 member AddMonths : months:int -> DateTime
 member AddSeconds : value:float -> DateTime
 member AddTicks : value:int64 -> DateTime
 member AddYears : value:int -> DateTime
 ...
 end
 Full name: System.DateTime
 --------------------
 System.DateTime()
 (+0 other overloads)
 System.DateTime(ticks: int64) : unit
 (+0 other overloads)
 System.DateTime(ticks: int64, kind: System.DateTimeKind) : unit
 (+0 other overloads)
 System.DateTime(year: int, month: int, day: int) : unit
 (+0 other overloads)
 System.DateTime(year: int, month: int, day: int, calendar: System.Globalization.Calendar) : unit
 (+0 other overloads)
 System.DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int) : unit
 (+0 other overloads)
 System.DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, kind: System.DateTimeKind) : unit
 (+0 other overloads)
 System.DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, calendar: System.Globalization.Calendar) : unit
 (+0 other overloads)
 System.DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, millisecond: int) : unit
 (+0 other overloads)
 System.DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, millisecond: int, kind: System.DateTimeKind) : unit
 (+0 other overloads)property System.DateTime.UtcNow: System.DateTimetype IntPath = PrintfFormat<(int -> string),unit,string,string,int>
 Full name: SuaveMusicStore.Path.IntPathMultiple items
 type PrintfFormat<'Printer,'State,'Residue,'Result> =
 new : value:string -> PrintfFormat<'Printer,'State,'Residue,'Result>
 member Value : string
 Full name: Microsoft.FSharp.Core.PrintfFormat<_,_,_,_>
 --------------------
 type PrintfFormat<'Printer,'State,'Residue,'Result,'Tuple> =
 inherit PrintfFormat<'Printer,'State,'Residue,'Result>
 new : value:string -> PrintfFormat<'Printer,'State,'Residue,'Result,'Tuple>
 Full name: Microsoft.FSharp.Core.PrintfFormat<_,_,_,_,_>
 --------------------
 new : value:string -> PrintfFormat<'Printer,'State,'Residue,'Result>
 --------------------
 new : value:string -> PrintfFormat<'Printer,'State,'Residue,'Result,'Tuple>Multiple items
 val int : value:'T -> int (requires member op_Explicit)
 Full name: Microsoft.FSharp.Core.Operators.int
 --------------------
 type int = int32
 Full name: Microsoft.FSharp.Core.int
 --------------------
 type int<'Measure> = int
 Full name: Microsoft.FSharp.Core.int<_>Multiple items
 val string : value:'T -> string
 Full name: Microsoft.FSharp.Core.Operators.string
 --------------------
 type string = System.String
 Full name: Microsoft.FSharp.Core.stringtype unit = Unit
 Full name: Microsoft.FSharp.Core.unitval withParam : key:string * value:string -> path:string -> string
 Full name: SuaveMusicStore.Path.withParamval key : stringval value : stringval path : stringval sprintf : format:Printf.StringFormat<'T> -> 'T
 Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.sprintfval home : string
 Full name: SuaveMusicStore.Path.homeval overview : string
 Full name: SuaveMusicStore.Path.Store.overviewval browse : string
 Full name: SuaveMusicStore.Path.Store.browseval details : IntPath
 Full name: SuaveMusicStore.Path.Store.detailsval browseKey : string
 Full name: SuaveMusicStore.Path.Store.browseKeyval manage : string
 Full name: SuaveMusicStore.Path.Admin.manageval createAlbum : string
 Full name: SuaveMusicStore.Path.Admin.createAlbumval editAlbum : IntPath
 Full name: SuaveMusicStore.Path.Admin.editAlbumval deleteAlbum : IntPath
 Full name: SuaveMusicStore.Path.Admin.deleteAlbumval logon : string
 Full name: SuaveMusicStore.Path.Account.logonval logoff : string
 Full name: SuaveMusicStore.Path.Account.logoffmodule Cart
 from SuaveMusicStore.Pathval overview : string
 Full name: SuaveMusicStore.Path.Cart.overviewval addAlbum : IntPath
 Full name: SuaveMusicStore.Path.Cart.addAlbumval removeAlbum : IntPath
 Full name: SuaveMusicStore.Path.Cart.removeAlbumnamespace Suavemodule Form
 from Suavetype Album =
 {ArtistId: decimal;
 GenreId: decimal;
 Title: string;
 Price: decimal;
 ArtUrl: string;}
 Full name: SuaveMusicStore.Form.AlbumAlbum.ArtistId: decimalMultiple items
 val decimal : value:'T -> decimal (requires member op_Explicit)
 Full name: Microsoft.FSharp.Core.Operators.decimal
 --------------------
 type decimal = System.Decimal
 Full name: Microsoft.FSharp.Core.decimal
 --------------------
 type decimal<'Measure> = decimal
 Full name: Microsoft.FSharp.Core.decimal<_>Album.GenreId: decimalAlbum.Title: stringAlbum.Price: decimalAlbum.ArtUrl: stringval album : Form<Album>
 Full name: SuaveMusicStore.Form.albumMultiple items
 union case Form.Form: FormProp<'a> list * ServerSideValidation<'a> list -> Form<'a>
 --------------------
 type Form<'a> = | Form of FormProp<'a> list * ServerSideValidation<'a> list
 Full name: Suave.Form.Form<_>union case FormProp.TextProp: Property<'a,string> -> FormProp<'a>val f : Albumval maxLength : max:int -> Validation<string>
 Full name: Suave.Form.maxLengthunion case FormProp.DecimalProp: Property<'a,decimal> -> FormProp<'a>val min : min:decimal -> Validation<decimal>
 Full name: Suave.Form.minval max : max:decimal -> Validation<decimal>
 Full name: Suave.Form.maxval step : step:System.Decimal -> Validation<decimal>
 Full name: Suave.Form.steptype Logon =
 {Username: string;
 Password: Password;}
 Full name: SuaveMusicStore.Form.LogonLogon.Username: stringMultiple items
 Logon.Password: Password
 --------------------
 type Password = | Password of string
 Full name: Suave.Form.Passwordval logon : Form<Logon>
 Full name: SuaveMusicStore.Form.logonmodule Html
 from Suaveval em : s:string -> Node
 Full name: SuaveMusicStore.View.emval s : stringval tag : tag:string -> attr:Attribute list -> contents:Node list -> Node
 Full name: Suave.Html.tagunion case Node.Text: string -> Nodeval cssLink : href:string -> Node
 Full name: SuaveMusicStore.View.cssLinkval href : stringval link : attr:Attribute list -> Node
 Full name: Suave.Html.linkval h2 : s:string -> Node
 Full name: SuaveMusicStore.View.h2val ul : nodes:Node list -> Node
 Full name: SuaveMusicStore.View.ulval nodes : Node listval ulAttr : attr:Attribute list -> nodes:Node list -> Node
 Full name: SuaveMusicStore.View.ulAttrval attr : Attribute listval li : (Node list -> Node)
 Full name: SuaveMusicStore.View.lival table : x:Node list -> Node
 Full name: SuaveMusicStore.View.tableval x : Node listval th : x:Node list -> Node
 Full name: SuaveMusicStore.View.thval tr : x:Node list -> Node
 Full name: SuaveMusicStore.View.trval td : x:Node list -> Node
 Full name: SuaveMusicStore.View.tdval strong : s:string -> Node
 Full name: SuaveMusicStore.View.strongval text : s:string -> Node list
 Full name: Suave.Html.textval form : x:Node list -> Node
 Full name: SuaveMusicStore.View.formval formInput : (('a -> Quotations.Expr<'b>) -> Attribute list -> Form<'a> -> Node)
 Full name: SuaveMusicStore.View.formInputval input : quotF:('a -> Quotations.Expr<'b>) -> attrs:Attribute list -> form:Form<'a> -> Node
 Full name: Suave.Form.inputval submitInput : value:string -> Node
 Full name: SuaveMusicStore.View.submitInputval input : attr:Attribute list -> Node
 Full name: Suave.Html.inputtype Field<'a> =
 {Label: string;
 Html: Form<'a> -> Node;}
 Full name: SuaveMusicStore.View.Field<_>Field.Label: stringMultiple items
 Field.Html: Form<'a> -> Node
 --------------------
 type HtmlAttribute = string * string
 Full name: Suave.Form.HtmlAttributeMultiple items
 union case Form.Form: FormProp<'a> list * ServerSideValidation<'a> list -> Form<'a>
 --------------------
 module Form
 from SuaveMusicStore
 --------------------
 type Form<'a> = | Form of FormProp<'a> list * ServerSideValidation<'a> list
 Full name: Suave.Form.Form<_>type Node =
 | Element of Element * Node list
 | VoidElement of Element
 | Text of string
 | Raw of string
 | WhiteSpace of string
 Full name: Suave.Html.Nodetype Fieldset<'a> =
 {Legend: string;
 Fields: Field<'a> list;}
 Full name: SuaveMusicStore.View.Fieldset<_>Fieldset.Legend: stringFieldset.Fields: Field<'a> listtype FormLayout<'a> =
 {Fieldsets: Fieldset<'a> list;
 SubmitText: string;
 Form: Form<'a>;}
 Full name: SuaveMusicStore.View.FormLayout<_>FormLayout.Fieldsets: Fieldset<'a> listFormLayout.SubmitText: stringMultiple items
 FormLayout.Form: Form<'a>
 --------------------
 module Form
 from SuaveMusicStore
 --------------------
 type Form<'a> = | Form of FormProp<'a> list * ServerSideValidation<'a> list
 Full name: Suave.Form.Form<_>val renderForm : layout:FormLayout<'a> -> Node
 Full name: SuaveMusicStore.View.renderFormval layout : FormLayout<'a>val set : Fieldset<'a>val field : Field<'a>val div : (Attribute list -> Node list -> Node)
 Full name: Suave.Html.divField.Html: Form<'a> -> NodeFormLayout.Form: Form<'a>val home : Node list
 Full name: SuaveMusicStore.View.homeval store : genres:string list -> Node list
 Full name: SuaveMusicStore.View.storeval genres : string listval p : (Attribute list -> Node list -> Node)
 Full name: Suave.Html.pMultiple items
 module List
 from Microsoft.FSharp.Collections
 --------------------
 type List<'T> =
 | ( [] )
 | ( :: ) of Head: 'T * Tail: 'T list
 interface IEnumerable
 interface IEnumerable<'T>
 member GetSlice : startIndex:int option * endIndex:int option -> 'T list
 member Head : 'T
 member IsEmpty : bool
 member Item : index:int -> 'T with get
 member Length : int
 member Tail : 'T list
 static member Cons : head:'T * tail:'T list -> 'T list
 static member Empty : 'T list
 Full name: Microsoft.FSharp.Collections.List<_>val length : list:'T list -> int
 Full name: Microsoft.FSharp.Collections.List.lengthval genre : stringval url : stringmodule Path
 from SuaveMusicStoremodule Store
 from SuaveMusicStore.Pathval a : href:string -> attr:Attribute list -> (Node list -> Node)
 Full name: Suave.Html.aval browse : genre:string -> albums:Db.Album list -> Node list
 Full name: SuaveMusicStore.View.browseval albums : Db.Album listmodule Db
 from SuaveMusicStoretype Album = FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.albumsEntity
 Full name: SuaveMusicStore.Db.Albumval album : Db.Albumval details : Path.IntPath
 Full name: SuaveMusicStore.Path.Store.detailsproperty FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.albumsEntity.Albumid: int
 <summary> integer</summary>property FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.albumsEntity.Title: string
 <summary> character varying(160)</summary>val details : album:Db.AlbumDetails -> Node list
 Full name: SuaveMusicStore.View.detailsval album : Db.AlbumDetailstype AlbumDetails = FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.albumdetailsEntity
 Full name: SuaveMusicStore.Db.AlbumDetailsproperty FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.albumdetailsEntity.Title: string
 <summary> character varying(160)</summary>val img : attr:Attribute list -> Node
 Full name: Suave.Html.imgproperty FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.albumdetailsEntity.Albumarturl: string
 <summary> character varying(1024)</summary>val caption : stringval t : stringproperty FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.albumdetailsEntity.Genre: string
 <summary> character varying(120)</summary>property FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.albumdetailsEntity.Artist: string
 <summary> character varying(120)</summary>property FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.albumdetailsEntity.Price: decimal
 <summary> numeric</summary>System.Decimal.ToString() : string
 System.Decimal.ToString(provider: System.IFormatProvider) : string
 System.Decimal.ToString(format: string) : string
 System.Decimal.ToString(format: string, provider: System.IFormatProvider) : stringval addAlbum : Path.IntPath
 Full name: SuaveMusicStore.Path.Cart.addAlbumproperty FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.albumdetailsEntity.Albumid: int
 <summary> integer</summary>val truncate : k:int -> s:string -> string
 Full name: SuaveMusicStore.View.truncateval k : intproperty System.String.Length: intSystem.String.Substring(startIndex: int) : string
 System.String.Substring(startIndex: int, length: int) : stringval manage : albums:Db.AlbumDetails list -> Node list
 Full name: SuaveMusicStore.View.manageval albums : Db.AlbumDetails listmodule Admin
 from SuaveMusicStore.Pathval editAlbum : Path.IntPath
 Full name: SuaveMusicStore.Path.Admin.editAlbumval deleteAlbum : Path.IntPath
 Full name: SuaveMusicStore.Path.Admin.deleteAlbumval deleteAlbum : albumTitle:string -> Node list
 Full name: SuaveMusicStore.View.deleteAlbumval albumTitle : stringval br : attr:Attribute list -> Node
 Full name: Suave.Html.brval createAlbum : genres:(decimal * string) list -> artists:(decimal * string) list -> Node list
 Full name: SuaveMusicStore.View.createAlbumval genres : (decimal * string) listval artists : (decimal * string) listval album : Form<Form.Album>
 Full name: SuaveMusicStore.Form.albumtype HtmlAttribute = string * string
 Full name: Suave.Form.HtmlAttributeval selectInput : quotF:('a -> Quotations.Expr<'b>) -> options:('b * string) list -> selected:'b option -> form:Form<'a> -> Node (requires equality)
 Full name: Suave.Form.selectInputval f : Form.AlbumForm.Album.GenreId: decimalForm.Album.ArtistId: decimalForm.Album.Title: stringForm.Album.Price: decimalForm.Album.ArtUrl: stringval editAlbum : album:Db.Album -> genres:(decimal * string) list -> artists:(decimal * string) list -> Node list
 Full name: SuaveMusicStore.View.editAlbumproperty FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.albumsEntity.Genreid: int
 <summary> integer</summary>property FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.albumsEntity.Artistid: int
 <summary> integer</summary>val formatDec : d:System.Decimal -> string
 Full name: Suave.Form.formatDecproperty FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.albumsEntity.Price: decimal
 <summary> numeric</summary>val logon : msg:string -> Node list
 Full name: SuaveMusicStore.View.logonval msg : stringval logon : Form<Form.Logon>
 Full name: SuaveMusicStore.Form.logonval f : Form.LogonForm.Logon.Username: stringForm.Logon.Password: Passwordval notFound : Node list
 Full name: SuaveMusicStore.View.notFoundval partNav : Node
 Full name: SuaveMusicStore.View.partNavval partUser : user:string option -> Node
 Full name: SuaveMusicStore.View.partUserval user : string optionMultiple items
 val option : value:string -> txt:string -> selected:bool -> Node
 Full name: Suave.Form.option
 --------------------
 type 'T option = Option<'T>
 Full name: Microsoft.FSharp.Core.option<_>val user : stringmodule Account
 from SuaveMusicStore.Pathval emptyCart : Node list
 Full name: SuaveMusicStore.View.emptyCartval nonEmptyCart : carts:Db.CartDetails list -> Node list
 Full name: SuaveMusicStore.View.nonEmptyCartval carts : Db.CartDetails listtype CartDetails = FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.cartdetailsEntity
 Full name: SuaveMusicStore.Db.CartDetailsval h : stringval cart : Db.CartDetailsproperty FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.cartdetailsEntity.Albumid: int
 <summary> integer</summary>property FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.cartdetailsEntity.Albumtitle: string
 <summary> character varying(160)</summary>property FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.cartdetailsEntity.Price: decimal
 <summary> numeric</summary>property FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.cartdetailsEntity.Count: int
 <summary> integer</summary>System.Int32.ToString() : string
 System.Int32.ToString(provider: System.IFormatProvider) : string
 System.Int32.ToString(format: string) : string
 System.Int32.ToString(format: string, provider: System.IFormatProvider) : stringval total : decimalval sumBy : projection:('T -> 'U) -> list:'T list -> 'U (requires member ( + ) and member get_Zero)
 Full name: Microsoft.FSharp.Collections.List.sumByval c : Db.CartDetailsval d : stringval cart : _arg1:Db.CartDetails list -> Node list
 Full name: SuaveMusicStore.View.cartMultiple items
 val list : Db.CartDetails list
 --------------------
 type 'T list = List<'T>
 Full name: Microsoft.FSharp.Collections.list<_>val index : partUser:Node -> container:Node list -> string
 Full name: SuaveMusicStore.View.indexval partUser : Nodeval container : Node listval html : (Attribute list -> Node list -> Node)
 Full name: Suave.Html.htmlval head : (Attribute list -> Node list -> Node)
 Full name: Suave.Html.headval title : attr:Attribute list -> s:string -> Node
 Full name: Suave.Html.titleval body : (Attribute list -> Node list -> Node)
 Full name: Suave.Html.bodyval htmlToString : node:Node -> string
 Full name: Suave.Html.htmlToStringmodule App
 from SuaveMusicStoremodule Authentication
 from Suavemodule Cookie
 from Suavemodule Filters
 from Suavemodule Model
 from Suavemodule Binding
 from Suave.Modelmodule Operators
 from Suavemodule RequestErrors
 from Suavemodule State
 from Suavemodule CookieStateStore
 from Suave.Statemodule Successful
 from Suavemodule Web
 from Suavetype UserLoggedOnSession =
 {Username: string;
 Role: string;}
 Full name: SuaveMusicStore.App.UserLoggedOnSessionUserLoggedOnSession.Username: stringMultiple items
 val string : value:'T -> string
 Full name: Microsoft.FSharp.Core.Operators.string
 --------------------
 type string = String
 Full name: Microsoft.FSharp.Core.stringUserLoggedOnSession.Role: stringMultiple items
 union case CookieLife.Session: CookieLife
 --------------------
 type Session =
 | NoSession
 | CartIdOnly of string
 | UserLoggedOn of UserLoggedOnSession
 Full name: SuaveMusicStore.App.Sessionunion case Session.NoSession: Sessionunion case Session.CartIdOnly: string -> Sessionunion case Session.UserLoggedOn: UserLoggedOnSession -> Sessionval session : f:(Session -> HttpContext -> Async<'a option>) -> (HttpContext -> Async<'a option>)
 Full name: SuaveMusicStore.App.sessionval f : (Session -> HttpContext -> Async<'a option>)val statefulForSession : WebPart
 Full name: Suave.State.CookieStateStore.statefulForSessionval context : apply:(HttpContext -> HttpContext -> 'a) -> context:HttpContext -> 'a
 Full name: Suave.Http.contextval x : HttpContextMultiple items
 module HttpContext
 from Suave.State.CookieStateStore
 --------------------
 module HttpContext
 from Suave.Authentication
 --------------------
 module HttpContext
 from Suave.Http
 --------------------
 type HttpContext =
 {request: HttpRequest;
 runtime: HttpRuntime;
 connection: Connection;
 userState: Map<string,obj>;
 response: HttpResult;}
 member clientIp : trustProxy:bool -> sources:string list -> IPAddress
 member clientPort : trustProxy:bool -> sources:string list -> Port
 member clientProto : trustProxy:bool -> sources:string list -> string
 member clientIpTrustProxy : IPAddress
 member clientPortTrustProxy : Port
 member clientProtoTrustProxy : string
 member isLocal : bool
 static member clientIp_ : Property<HttpContext,IPAddress>
 static member clientPort_ : Property<HttpContext,Port>
 static member clientProto_ : Property<HttpContext,string>
 static member connection_ : Property<HttpContext,Connection>
 static member isLocal_ : Property<HttpContext,bool>
 static member request_ : Property<HttpContext,HttpRequest>
 static member response_ : Property<HttpContext,HttpResult>
 static member runtime_ : Property<HttpContext,HttpRuntime>
 static member userState_ : Property<HttpContext,Map<string,obj>>
 Full name: Suave.Http.HttpContextval state : ctx:HttpContext -> State.StateStore option
 Full name: Suave.State.CookieStateStore.HttpContext.stateval state : State.StateStoreabstract member State.StateStore.get : string -> 'T optionval role : stringval html : container:Html.Node list -> (HttpContext -> Async<HttpContext option>)
 Full name: SuaveMusicStore.App.htmlval container : Html.Node listval result : (string option -> HttpContext -> Async<HttpContext option>)val OK : body:string -> WebPart
 Full name: Suave.Successful.OKmodule View
 from SuaveMusicStoreval index : partUser:Html.Node -> container:Html.Node list -> string
 Full name: SuaveMusicStore.View.indexval partUser : user:string option -> Html.Node
 Full name: SuaveMusicStore.View.partUsermodule Writers
 from Suaveval setMimeType : mimeType:string -> WebPart
 Full name: Suave.Writers.setMimeTypeval browse : (HttpContext -> Async<HttpContext option>)
 Full name: SuaveMusicStore.App.browseval request : apply:(HttpRequest -> HttpContext -> 'a) -> context:HttpContext -> 'a
 Full name: Suave.Http.requestval r : HttpRequestmember HttpRequest.queryParam : key:string -> Choice<string,string>union case Choice.Choice1Of2: 'T1 -> Choice<'T1,'T2>val getContext : unit -> FSharp.Data.Sql.SqlDataProvider<...>.dataContext
 Full name: SuaveMusicStore.Db.getContextval getAlbumsForGenre : genreName:string -> ctx:Db.DbContext -> Db.Album list
 Full name: SuaveMusicStore.Db.getAlbumsForGenreval browse : genre:string -> albums:Db.Album list -> Html.Node list
 Full name: SuaveMusicStore.View.browseunion case Choice.Choice2Of2: 'T2 -> Choice<'T1,'T2>val BAD_REQUEST : body:string -> WebPart
 Full name: Suave.RequestErrors.BAD_REQUESTval overview : (HttpContext -> Async<HttpContext option>)
 Full name: SuaveMusicStore.App.overviewval warbler : f:('t -> 't -> 'u) -> 't -> 'u
 Full name: Suave.WebPart.warblerval getGenres : ctx:Db.DbContext -> Db.Genre list
 Full name: SuaveMusicStore.Db.getGenresval map : mapping:('T -> 'U) -> list:'T list -> 'U list
 Full name: Microsoft.FSharp.Collections.List.mapval g : Db.Genreproperty FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.genresEntity.Name: string
 <summary> character varying(120)</summary>val store : genres:string list -> Html.Node list
 Full name: SuaveMusicStore.View.storeval details : id:int -> (HttpContext -> Async<HttpContext option>)
 Full name: SuaveMusicStore.App.detailsval getAlbumDetails : id:int -> ctx:Db.DbContext -> Db.AlbumDetails option
 Full name: SuaveMusicStore.Db.getAlbumDetailsval details : album:Db.AlbumDetails -> Html.Node list
 Full name: SuaveMusicStore.View.detailsval never : WebPart<'a>
 Full name: Suave.WebPart.neverval manage : (HttpContext -> Async<HttpContext option>)
 Full name: SuaveMusicStore.App.manageval getAlbumsDetails : ctx:Db.DbContext -> Db.AlbumDetails list
 Full name: SuaveMusicStore.Db.getAlbumsDetailsval manage : albums:Db.AlbumDetails list -> Html.Node list
 Full name: SuaveMusicStore.View.manageval bindToForm : form:Form<'a> -> handler:('a -> HttpContext -> Async<HttpContext option>) -> (HttpContext -> Async<HttpContext option>)
 Full name: SuaveMusicStore.App.bindToFormval form : Form<'a>val handler : ('a -> HttpContext -> Async<HttpContext option>)val bindReq : f:(HttpRequest -> Choice<'b,'c>) -> fCont:('b -> HttpContext -> 'd) -> fErr:('c -> HttpContext -> 'd) -> (HttpContext -> 'd)
 Full name: Suave.Model.Binding.bindReqval bindForm : form:Form<'a> -> req:HttpRequest -> Choice<'a,string>
 Full name: Suave.Form.bindFormval createAlbum : WebPart<HttpContext>
 Full name: SuaveMusicStore.App.createAlbumval ctx : FSharp.Data.Sql.SqlDataProvider<...>.dataContextval choose : options:WebPart<'a> list -> WebPart<'a>
 Full name: Suave.WebPart.chooseval GET : WebPart
 Full name: Suave.Filters.GETMultiple items
 val decimal : value:'T -> decimal (requires member op_Explicit)
 Full name: Microsoft.FSharp.Core.Operators.decimal
 --------------------
 type decimal = Decimal
 Full name: Microsoft.FSharp.Core.decimal
 --------------------
 type decimal<'Measure> = decimal
 Full name: Microsoft.FSharp.Core.decimal<_>property FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.genresEntity.Genreid: int
 <summary> integer</summary>val getArtists : ctx:Db.DbContext -> Db.Artist list
 Full name: SuaveMusicStore.Db.getArtistsval g : Db.Artistproperty FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.artistsEntity.Artistid: int
 <summary> integer</summary>property FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.artistsEntity.Name: string
 <summary> character varying(120)</summary>val createAlbum : genres:(decimal * string) list -> artists:(decimal * string) list -> Html.Node list
 Full name: SuaveMusicStore.View.createAlbumval POST : WebPart
 Full name: Suave.Filters.POSTMultiple items
 union case Form.Form: FormProp<'a> list * ServerSideValidation<'a> list -> Form<'a>
 --------------------
 module Form
 from Suave
 --------------------
 module Form
 from SuaveMusicStore
 --------------------
 type Form<'a> = | Form of FormProp<'a> list * ServerSideValidation<'a> list
 Full name: Suave.Form.Form<_>val form : Form.Albumval createAlbum : artistId:int * genreId:int * price:decimal * title:string -> ctx:Db.DbContext -> Unit
 Full name: SuaveMusicStore.Db.createAlbummodule Redirection
 from Suaveval FOUND : location:string -> WebPart
 Full name: Suave.Redirection.FOUNDval editAlbum : id:int -> WebPart<HttpContext>
 Full name: SuaveMusicStore.App.editAlbumval getAlbum : id:int -> ctx:Db.DbContext -> Db.Album option
 Full name: SuaveMusicStore.Db.getAlbumval editAlbum : album:Db.Album -> genres:(decimal * string) list -> artists:(decimal * string) list -> Html.Node list
 Full name: SuaveMusicStore.View.editAlbumval updateAlbum : album:Db.Album -> artistId:int * genreId:int * price:decimal * title:string -> ctx:Db.DbContext -> Unit
 Full name: SuaveMusicStore.Db.updateAlbumval deleteAlbum : id:int -> WebPart<HttpContext>
 Full name: SuaveMusicStore.App.deleteAlbumval deleteAlbum : albumTitle:string -> Html.Node list
 Full name: SuaveMusicStore.View.deleteAlbumval deleteAlbum : album:Db.Album -> ctx:Db.DbContext -> Unit
 Full name: SuaveMusicStore.Db.deleteAlbumval passHash : pass:string -> string
 Full name: SuaveMusicStore.App.passHashval pass : stringval sha : Security.Cryptography.SHA256namespace System.Securitynamespace System.Security.Cryptographytype SHA256 =
 inherit HashAlgorithm
 static member Create : unit -> SHA256 + 1 overload
 Full name: System.Security.Cryptography.SHA256Security.Cryptography.SHA256.Create() : Security.Cryptography.SHA256
 Security.Cryptography.SHA256.Create(hashName: string) : Security.Cryptography.SHA256namespace System.Texttype Encoding =
 member BodyName : string
 member Clone : unit -> obj
 member CodePage : int
 member DecoderFallback : DecoderFallback with get, set
 member EncoderFallback : EncoderFallback with get, set
 member EncodingName : string
 member Equals : value:obj -> bool
 member GetByteCount : chars:char[] -> int + 3 overloads
 member GetBytes : chars:char[] -> byte[] + 5 overloads
 member GetCharCount : bytes:byte[] -> int + 2 overloads
 ...
 Full name: System.Text.Encodingproperty Text.Encoding.UTF8: Text.EncodingText.Encoding.GetBytes(s: string) : byte []
 Text.Encoding.GetBytes(chars: char []) : byte []
 Text.Encoding.GetBytes(chars: char [], index: int, count: int) : byte []
 Text.Encoding.GetBytes(chars: nativeptr<char>, charCount: int, bytes: nativeptr<byte>, byteCount: int) : int
 Text.Encoding.GetBytes(s: string, charIndex: int, charCount: int, bytes: byte [], byteIndex: int) : int
 Text.Encoding.GetBytes(chars: char [], charIndex: int, charCount: int, bytes: byte [], byteIndex: int) : intSecurity.Cryptography.HashAlgorithm.ComputeHash(buffer: byte []) : byte []
 Security.Cryptography.HashAlgorithm.ComputeHash(inputStream: IO.Stream) : byte []
 Security.Cryptography.HashAlgorithm.ComputeHash(buffer: byte [], offset: int, count: int) : byte []type Array =
 member Clone : unit -> obj
 member CopyTo : array:Array * index:int -> unit + 1 overload
 member GetEnumerator : unit -> IEnumerator
 member GetLength : dimension:int -> int
 member GetLongLength : dimension:int -> int64
 member GetLowerBound : dimension:int -> int
 member GetUpperBound : dimension:int -> int
 member GetValue : [<ParamArray>] indices:int[] -> obj + 7 overloads
 member Initialize : unit -> unit
 member IsFixedSize : bool
 ...
 Full name: System.Arrayval map : mapping:('T -> 'U) -> array:'T [] -> 'U []
 Full name: Microsoft.FSharp.Collections.Array.mapval b : byteByte.ToString() : string
 Byte.ToString(provider: IFormatProvider) : string
 Byte.ToString(format: string) : string
 Byte.ToString(format: string, provider: IFormatProvider) : stringMultiple items
 type String =
 new : value:char -> string + 7 overloads
 member Chars : int -> char
 member Clone : unit -> obj
 member CompareTo : value:obj -> int + 1 overload
 member Contains : value:string -> bool
 member CopyTo : sourceIndex:int * destination:char[] * destinationIndex:int * count:int -> unit
 member EndsWith : value:string -> bool + 2 overloads
 member Equals : obj:obj -> bool + 2 overloads
 member GetEnumerator : unit -> CharEnumerator
 member GetHashCode : unit -> int
 ...
 Full name: System.String
 --------------------
 String(value: nativeptr<char>) : unit
 String(value: nativeptr<sbyte>) : unit
 String(value: char []) : unit
 String(c: char, count: int) : unit
 String(value: nativeptr<char>, startIndex: int, length: int) : unit
 String(value: nativeptr<sbyte>, startIndex: int, length: int) : unit
 String(value: char [], startIndex: int, length: int) : unit
 String(value: nativeptr<sbyte>, startIndex: int, length: int, enc: Text.Encoding) : unitval concat : sep:string -> strings:seq<string> -> string
 Full name: Microsoft.FSharp.Core.String.concatval sessionStore : setF:(State.StateStore -> HttpContext -> Async<HttpContext option>) -> (HttpContext -> Async<HttpContext option>)
 Full name: SuaveMusicStore.App.sessionStoreval setF : (State.StateStore -> HttpContext -> Async<HttpContext option>)val returnPathOrHome : (HttpContext -> Async<HttpContext option>)
 Full name: SuaveMusicStore.App.returnPathOrHomeval x : HttpRequestval logon : WebPart<HttpContext>
 Full name: SuaveMusicStore.App.logonval logon : msg:string -> Html.Node list
 Full name: SuaveMusicStore.View.logonval form : Form.LogonMultiple items
 union case Password.Password: string -> Password
 --------------------
 type Password = | Password of string
 Full name: Suave.Form.Passwordval validateUser : username:string * password:string -> ctx:Db.DbContext -> Db.User option
 Full name: SuaveMusicStore.Db.validateUserval user : Db.Userval authenticated : relativeExpiry:CookieLife -> secure:bool -> WebPart
 Full name: Suave.Authentication.authenticatedtype CookieLife =
 | Session
 | MaxAge of duration: TimeSpan
 Full name: Suave.Cookie.CookieLifeunion case CookieLife.Session: CookieLifeval succeed : WebPart<'a>
 Full name: Suave.WebPart.succeedval store : State.StateStoreabstract member State.StateStore.set : string -> 'T -> WebPartproperty FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.usersEntity.Username: string
 <summary> character varying(200)</summary>property FSharp.Data.Sql.SqlDataProvider<...>.dataContext.public.usersEntity.Role: string
 <summary> character varying(50)</summary>val reset : (HttpContext -> Async<HttpContext option>)
 Full name: SuaveMusicStore.App.resetval unsetPair : httpCookieName:string -> WebPart
 Full name: Suave.Cookie.unsetPairval SessionAuthCookie : string
 Full name: Suave.Authentication.SessionAuthCookieval StateCookie : string
 Full name: Suave.State.CookieStateStore.StateCookieval redirectWithReturnPath : redirection:string -> (HttpContext -> Async<HttpContext option>)
 Full name: SuaveMusicStore.App.redirectWithReturnPathval redirection : stringHttpRequest.url: Uriproperty Uri.AbsolutePath: stringval loggedOn : f_success:WebPart -> WebPart
 Full name: SuaveMusicStore.App.loggedOnval f_success : WebPartval authenticate : relativeExpiry:CookieLife -> secure:bool -> missingCookie:(unit -> Choice<byte [],WebPart>) -> decryptionFailure:(Utils.Crypto.SecretboxDecryptionError -> Choice<byte [],WebPart>) -> fSuccess:WebPart -> WebPart
 Full name: Suave.Authentication.authenticateval admin : f_success:(HttpContext -> Async<HttpContext option>) -> WebPart
 Full name: SuaveMusicStore.App.adminval f_success : (HttpContext -> Async<HttpContext option>)val FORBIDDEN : body:string -> WebPart
 Full name: Suave.RequestErrors.FORBIDDENval UNAUTHORIZED : body:string -> WebPart
 Full name: Suave.RequestErrors.UNAUTHORIZEDval cart : (HttpContext -> Async<HttpContext option>)
 Full name: SuaveMusicStore.App.cartval cart : _arg1:Db.CartDetails list -> Html.Node list
 Full name: SuaveMusicStore.View.cartval addToCart : albumId:int -> (HttpContext -> Async<HttpContext option>)
 Full name: SuaveMusicStore.App.addToCartMultiple items
 type Guid =
 struct
 new : b:byte[] -> Guid + 4 overloads
 member CompareTo : value:obj -> int + 1 overload
 member Equals : o:obj -> bool + 1 overload
 member GetHashCode : unit -> int
 member ToByteArray : unit -> byte[]
 member ToString : unit -> string + 2 overloads
 static val Empty : Guid
 static member NewGuid : unit -> Guid
 static member Parse : input:string -> Guid
 static member ParseExact : input:string * format:string -> Guid
 ...
 end
 Full name: System.Guid
 --------------------
 Guid()
 Guid(b: byte []) : unit
 Guid(g: string) : unit
 Guid(a: int, b: int16, c: int16, d: byte []) : unit
 Guid(a: uint32, b: uint16, c: uint16, d: byte, e: byte, f: byte, g: byte, h: byte, i: byte, j: byte, k: byte) : unit
 Guid(a: int, b: int16, c: int16, d: byte, e: byte, f: byte, g: byte, h: byte, i: byte, j: byte, k: byte) : unitGuid.NewGuid() : Guidval addToCart : cartId:string -> albumId:int -> ctx:Db.DbContext -> Unit
 Full name: SuaveMusicStore.Db.addToCartval webPart : WebPart<HttpContext>
 Full name: SuaveMusicStore.App.webPartval path : pathAfterDomain:string -> WebPart
 Full name: Suave.Filters.pathval home : Html.Node list
 Full name: SuaveMusicStore.View.homeval pathScan : pf:PrintfFormat<'a,'b,'c,'d,'t> -> h:('t -> WebPart) -> WebPart
 Full name: Suave.Filters.pathScanval pathRegex : pathAfterDomainRegex:string -> WebPart
 Full name: Suave.Filters.pathRegexmodule Files
 from Suaveval browseHome : WebPart
 Full name: Suave.Files.browseHomeval notFound : Html.Node list
 Full name: SuaveMusicStore.View.notFoundval startWebServer : config:SuaveConfig -> webpart:WebPart -> unit
 Full name: Suave.Web.startWebServerval defaultConfig : SuaveConfig
 Full name: Suave.Web.defaultConfig
Show code from this section on GitHub