module Data.List.Alternative
       ( head
       , tail
       , init
       , last
       , scanl1
       , scanr1
       , cycle
       ) where

import Prelude hiding ( head
                      , tail
                      , init
                      , last
                      , scanl1
                      , scanr1
                      , cycle )

import qualified Data.List as L

import Control.Applicative

wrap :: Alternative f => ([a] -> b) -> [a] -> f b
wrap _ [] = empty
wrap f xs = pure (f xs)

head :: Alternative f => [a] -> f a
head = wrap L.head

tail :: Alternative f => [a] -> f [a]
tail = wrap L.tail

init :: Alternative f => [a] -> f [a]
init = wrap L.init

last :: Alternative f => [a] -> f a
last = wrap L.last

scanl1 :: Alternative f => (a -> a -> a) -> [a] -> f [a]
scanl1 = wrap . L.scanl1

scanr1 :: Alternative f => (a -> a -> a) -> [a] -> f [a]
scanr1 = wrap . L.scanr1

cycle :: Alternative f => [a] -> f [a]
cycle = wrap L.cycle