packages feed

weekdaze-0.0.0.1: src-lib/WeekDaze/TeacherView/TimetableForWeek.hs

{-
	Copyright (C) 2013-2015 Dr. Alistair Ward

	This file is part of WeekDaze.

	WeekDaze is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	WeekDaze is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with WeekDaze.  If not, see <http://www.gnu.org/licenses/>.
-}
{- |
 [@AUTHOR@]	Dr. Alistair Ward

 [@DESCRIPTION@] Defines the type of a /teacher/'s personal /timetable/ for any week.
-}

module WeekDaze.TeacherView.TimetableForWeek(
-- * Types
-- ** Type-synonyms
	TimetableForWeek,
-- * Functions
	countLocationChanges
) where

import			Control.Arrow((&&&))
import qualified	Data.Array.IArray
import qualified	Data.Foldable
import qualified	WeekDaze.Model.Lesson			as Model.Lesson
import qualified	WeekDaze.Model.TimetableForWeek		as Model.TimetableForWeek
import qualified	WeekDaze.TeacherView.LessonResourceIds	as TeacherView.LessonResourceIds

-- | A timetable for one 'teacher', for any week.
type TimetableForWeek timeslotId locationId level	= Model.TimetableForWeek.TimetableForWeek timeslotId (TeacherView.LessonResourceIds.LessonResourceIds locationId) level

{- |
	* Counts the number of times a /teacher/ has to relocate.

	* CAVEAT: an unallocated /time-slot/ is considered to have an unspecified /location/,
	which matches that of any adjacent unallocated /time-slot/s, but never that of an adjacent /lesson/.
-}
countLocationChanges :: (Data.Array.IArray.Ix timeslotId, Eq locationId) => TimetableForWeek timeslotId locationId level -> Int
countLocationChanges	= foldr (
	\(x, y)	-> if x /= y then succ else id	-- Count the number of times (Maybe locationId) changes.
 ) 0 . uncurry zip . (
	init &&& tail
 ) . Data.Foldable.concatMap (
	map (
		fmap $ TeacherView.LessonResourceIds.getLocationId . Model.Lesson.getResourceIds
	) . Data.Array.IArray.elems
 )