burrito-1.0.2.0: src/lib/Burrito/Type/NonEmpty.hs
{-# LANGUAGE DeriveLift #-}
-- | Warning: This module is not considered part of Burrito's public API. As
-- such, it may change at any time. Use it with caution!.
module Burrito.Type.NonEmpty
( NonEmpty(..)
, fromList
, singleton
, toList
)
where
import qualified Language.Haskell.TH.Syntax as TH
-- | This simple type is used as a replacement for
-- @Data.List.NonEmpty.NonEmpty@ so that we can provide our own instances that
-- are consistent across versions of GHC.
data NonEmpty a = NonEmpty
{ first :: a
, rest :: [a]
} deriving (Eq, TH.Lift, Show)
-- | Attempts to convert a regular list into a non-empty list.
fromList :: [a] -> Maybe (NonEmpty a)
fromList xs = case xs of
[] -> Nothing
x : ys -> Just NonEmpty { first = x, rest = ys }
-- | Creates a non-empty list with a single element.
singleton :: a -> NonEmpty a
singleton x = NonEmpty { first = x, rest = [] }
-- | Converts a non-empty list back into a regular list.
toList :: NonEmpty a -> [a]
toList xs = first xs : rest xs