data Bool () where {
    True : Bool () 
    False : Bool ()
};

data List ('a) where {
    Nil : List ('a) 
    Cons : ('a) -> List ('a) -> List ('a)
};

data Maybe ('a) where {
    Nothing : Maybe ('a)
    Just : 'a -> Maybe ('a)
};

data Either ('a 'b) where {
    Left : 'a -> Either ('a 'b)
    Right : 'b -> Either ('a 'b)
};

safeHead : List ('a) -> Maybe ('a) ;
safeHead xs =
    case xs of {
        Nil => Nothing ;
        Cons x xs => Just x
    };

main : Maybe (_Int) ;
main = safeHead (Cons 0 (Cons 1 Nil)) ;

maybeToEither : Either ('a 'b) ->  Maybe ('a) ;
maybeToEither e =
    case e of {
        Left y => Nothing ;
        Right x => Just x
    };

id : 'a -> 'a ;
id x = x ;

-- Bug, occurs check failed
holdFn : Maybe ('b -> 'b) ;
holdFn = Just id ;
