๐Ÿ“ฆ sleepyfran / duets

๐Ÿ“„ Band.fs ยท 84 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84module Duets.Entities.Band

open System

type BandNameValidationError =
    | NameTooShort
    | NameTooLong

/// Returns default values for a band to serve as a placeholder to build a band
/// upon. Generates a valid ID.
let empty =
    { Id = BandId <| Identity.create ()
      StartDate = Calendar.gameBeginning
      OriginCity = NewYork
      Name = ""
      Genre = ""
      Fans = Map.empty
      Members = []
      PastMembers = [] }

/// Creates a band given its name, genre and initial member.
let from name genre initialMember startDate originCity =
    { Id = BandId <| Identity.create ()
      StartDate = startDate
      OriginCity = originCity
      Name = name
      Genre = genre
      Fans = Map.empty
      Members = [ initialMember ]
      PastMembers = [] }

/// Validates whether the name of the band is valid or not.
let validateName name =
    if String.IsNullOrEmpty name then Error NameTooShort
    else if String.length name > 100 then Error NameTooLong
    else Ok name

module Member =
    /// Creates a member from a character and a role from today onwards.
    let from character role today =
        { CharacterId = character
          Role = role
          Since = today }

    /// Creates a current member of the band given a member available for hiring.
    let fromMemberForHire date (memberForHire: MemberForHire) =
        from memberForHire.Character.Id memberForHire.Role date

module MemberForHire =
    /// Creates a member for hire given a character, its role and its skills.
    let from character role skills =
        { Character = character
          Role = role
          Skills = skills }

module PastMember =
    /// Creates a past member given a current member with today as its fired date.
    let fromMember (currentMember: CurrentMember) today =
        { CharacterId = currentMember.CharacterId
          Role = currentMember.Role
          Period = (currentMember.Since, today) }

module SongRepertoire =
    /// Creates a completely empty song repertoire.
    let empty =
        { UnfinishedSongs = Map.empty
          FinishedSongs = Map.empty }

    /// Creates an empty band song repertoire for a given band.
    let emptyFor bandId =
        { UnfinishedSongs = [ (bandId, Map.empty) ] |> Map.ofSeq
          FinishedSongs = [ bandId, Map.empty ] |> Map.ofSeq }

module AlbumRepertoire =
    /// Creates a completely empty album repertoire.
    let empty =
        { UnreleasedAlbums = Map.empty
          ReleasedAlbums = Map.empty }

    /// Creates an empty band album repertoire for a given band.
    let emptyFor bandId =
        { UnreleasedAlbums = [ (bandId, Map.empty) ] |> Map.ofSeq
          ReleasedAlbums = [ bandId, Map.empty ] |> Map.ofSeq }