packages feed

keera-hails-mvc-solutions-gtk-0.7.0: src/Hails/MVC/Model/ProtectedModel/UpdatableModel.hs

{-# LANGUAGE FlexibleInstances #-}
-- |
--
-- Copyright   : (C) Keera Studios Ltd, 2013
-- License     : BSD3
-- Maintainer  : support@keera.co.uk
module Hails.MVC.Model.ProtectedModel.UpdatableModel where

import Hails.MVC.Model.ReactiveModel
import Hails.MVC.Model.ProtectedModel

import Data.ExtraVersion

import Hails.MVC.Model.ProtectedModel.VersionedModel

class VersionedBasicModel a => UpdatableBasicModel a where
  getBMUpdateURI :: a -> String
  getBMMaxVersionAvail :: a -> Maybe Version
  setBMMaxVersionAvail :: a -> Version -> a

class VersionedProtectedModel a => UpdatableProtectedModel a where
  getUpdateURI       :: a -> IO String
  getMaxVersionAvail :: a -> IO (Maybe Version)
  setMaxVersionAvail :: a -> Version -> IO ()

class Event a => UpdateNotifiableEvent a where
  updateNotificationEvent :: a

instance (UpdatableBasicModel a, UpdateNotifiableEvent b) => UpdatableProtectedModel (ProtectedModel a b) where
  getUpdateURI = (`onReactiveModel` getRMUpdateURI)
    where getRMUpdateURI = getBMUpdateURI . basicModel
  getMaxVersionAvail = (`onReactiveModel` getRMMaxVersionAvail)
    where getRMMaxVersionAvail = getBMMaxVersionAvail . basicModel
  setMaxVersionAvail pm v = pm `applyToReactiveModel` setRMMaxVersionAvail
    where setRMMaxVersionAvail rm = let rm' =  rm `onBasicModel` (`setBMMaxVersionAvail` v)
                                    in triggerEvent rm' updateNotificationEvent