{-|
Module      : Net.DNSBase.NonEmpty
Description : Non-empty-list interface for collection-shaped RR data
Copyright   : (c) Viktor Dukhovni, 2026
License     : BSD-3-Clause
Maintainer  : ietf-dane@dukhovni.org
Stability   : unstable

The 'NonEmpty' type from "Data.List.NonEmpty" plus a typeclass
'IsNonEmptyList' modelled on 'GHC.IsList.IsList': types like
'Net.DNSBase.RData.SVCB.SPV_mandatory' that hold a non-empty
collection can derive a conversion through this class without
having to provide the @[a]@-typed 'GHC.IsList.IsList' interface
that would tempt callers into supplying empty lists.
-}

module Net.DNSBase.NonEmpty
    ( IsNonEmptyList(..)
    , NonEmpty(..)
    ) where

import Data.List.NonEmpty (NonEmpty(..))
import Data.Kind (Type)

-- | Structures that can be converted to non-empty lists.  Note that
-- 'toNonEmptyList' and 'fromNonEmptyList' aren't necessarily inverses.
-- The result may, for example, be reordered or deduplicated.
class IsNonEmptyList a where
    type Item1 a      :: Type
    toNonEmptyList   :: a -> NonEmpty (Item1 a)
    fromNonEmptyList :: NonEmpty (Item1 a) -> a

instance IsNonEmptyList (NonEmpty a) where
    type Item1 (NonEmpty a) = a
    toNonEmptyList :: NonEmpty a -> NonEmpty (Item1 (NonEmpty a))
toNonEmptyList = NonEmpty a -> NonEmpty a
NonEmpty a -> NonEmpty (Item1 (NonEmpty a))
forall a. a -> a
id
    fromNonEmptyList :: NonEmpty (Item1 (NonEmpty a)) -> NonEmpty a
fromNonEmptyList = NonEmpty a -> NonEmpty a
NonEmpty (Item1 (NonEmpty a)) -> NonEmpty a
forall a. a -> a
id