module SafePartialFunctions (gotail, gohead) where

import Prelude hiding (fromJust, tail, head)

import Data.Maybe


{-@ fromJust :: {v:Maybe a | isJust v} -> a @-}
fromJust :: Maybe a -> a
fromJust (Just a) = a

{-@ tail :: {v:[a] | len v > 0} -> [a] @-}
tail :: [a] -> [a]
tail (x:xs) = xs

{-@ head :: {v:[a] | len v > 0} -> a @-}
head :: [a] -> a
head (x:xs) = x

-- USERS

gotail xs = case xs of
             [] -> []
             y : ys -> tail xs

{-@ gohead :: [{v:[a] | len v > 0}] -> [a] @-}
gohead :: [[a]] -> [a]
gohead xs = map head xs
