    -- |
    -- Module      : Basement.NonEmpty
    -- License     : BSD-style
    -- Maintainer  : Foundation
    -- Stability   : experimental
    -- Portability : portable
    --
    -- A newtype wrapper around a non-empty Collection.

    module Basement.NonEmpty
        ( NonEmpty(..)
        ) where

    import           Basement.Exception
    import           Basement.Compat.Base

    -- | NonEmpty property for any Collection
    newtype NonEmpty a = NonEmpty { getNonEmpty :: a }
        deriving (Show,Eq)

    instance IsList c => IsList (NonEmpty c) where
        type Item (NonEmpty c) = Item c
        toList      = toList . getNonEmpty
        fromList [] = throw NonEmptyCollectionIsEmpty
        fromList l  = NonEmpty . fromList $ l