packages feed

scheduling-0.1.0.0: src/Control/Scheduling/Person.hs

module Control.Scheduling.Person ( Person(..)
                               , Gender(..)
                               , simplePerson
                               , firstName
                               , lastName
                               , email
                               --, school
                               --, office
                               , availability
                               , preferences
                               --, gender
                               --, urm
                               --, application
                               --, local
                               --, contact
                               --, ref
                               --, biography
                               , fullName
                               , zoom
                               , maxMeetings
                               , minMeetings
                               , maxMeetingSize
                               , requestedOnly
                               , application
                               , group
                               ) where

import Text.Printf (printf, PrintfArg(..), fmtPrecision, fmtChar, errorBadFormat, formatString, vFmt, IsChar)
import Control.Lens ((^.), (.~), (<&>), set, view, makeLenses, makeFields)
import Control.Scheduling.TimeSpan (TimeSpan(..))
import Data.Text (Text)
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Maybe (fromMaybe)
import Control.Monad (liftM)
import Control.Lens hiding (zoom)
import Data.Text (pack, unpack, intercalate)

data Gender = Male | Female | Other
  deriving (Ord, Show, Eq)

data Person = Person { _firstName :: Text
                     , _lastName :: Text
                     , _email :: Maybe Text
                     --, _school :: Maybe Text
                     --, _office :: Maybe Text
                     , _availability :: Maybe [TimeSpan]
                     , _preferences :: Maybe (Map Person Int)
                     --, _gender :: Maybe Gender
                     --, _urm :: Maybe Bool
                     , _application :: Maybe Text
                     --, _local :: Maybe Bool
                     --, _contact :: Maybe Person
                     --, _ref :: Maybe Text
                     --, _biography :: Maybe Text
                     , _zoom :: Maybe Text
                     , _maxMeetings :: Int
                     , _minMeetings :: Int
                     , _maxMeetingSize :: Int
                     , _requestedOnly :: Bool
                     , _group :: Maybe Text
                     } deriving (Eq, Ord)

simplePerson :: Text -> Text -> Person
simplePerson first last = Person first last Nothing Nothing Nothing Nothing Nothing 3 1 2 True Nothing
--simplePerson first last = Person first last Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing 1 2 True

instance PrintfArg Person where
  formatArg Person{..} fmt = formatString (printf "%s %s" _firstName _lastName :: String) (fmt { fmtChar = 's', fmtPrecision = Nothing })
--  formatArg Person{..} fmt = formatString (printf "%s %s: Avail slots=%s, Req slots=%s" _firstName _lastName ((show . liftM length) _availability) ((show . liftM (sum . Map.elems)) _preferences) :: String) (fmt { fmtChar = 's', fmtPrecision = Nothing })  


makeLenses ''Person

instance Show Person where
  show p = (unpack . intercalate " ") [p^.firstName, p^.lastName, (pack . show) (p^.minMeetings), (pack . show) (p^.maxMeetings)]

fullName :: Lens' Person (Text, Text)
fullName = lens (\p -> (p ^. firstName, p ^. lastName)) undefined