module SListTest where

import SList 

-- Swapped order of type arguments to List
-- added case analysis for results of sTail and sInit 
-- to propagate existential

data Entry = Entry { name   :: String, 
                     -- Store at least one number per person, first one is default
                     number :: List Int Safe } deriving (Show)

getNumber :: Entry -> Int
getNumber e = sHead (number e)

addDefault :: Int -> Entry -> Entry
addDefault i e = 
  if not (sElem i l) 
  then e { number = cons i l }
  else e 
    where l = number e 

addOther  :: Int -> Entry -> Entry
addOther i e = 
  if not (sElem i l)
  then e { number = cons (sHead l) (case (sTail l) of L tl -> cons i tl) }
  else e
    where l = number e

rotate :: Entry -> Entry
rotate e = 
	 e { number = (case (sInit l) of L li -> cons (sLast l) li) }
    where l = number e


stephanie = Entry { name = "Stephanie", number = cons 1 (cons 2 nil) }

--benjamin = Entry { name = "Benjamin", number = nil }