-----------------------------------------------------------------------------
-- |
-- Module      :  Distribution.Compat.SnocList
-- License     :  BSD3
--
-- Maintainer  :  cabal-dev@haskell.org
-- Stability   :  experimental
-- Portability :  portable
--
-- A very reversed list. Has efficient `snoc`
module Distribution.Compat.SnocList (
    SnocList,
    runSnocList,
    snoc,
) where

import Prelude ()
import Distribution.Compat.Prelude

newtype SnocList a = SnocList [a]

snoc :: SnocList a -> a -> SnocList a
snoc :: SnocList a -> a -> SnocList a
snoc (SnocList [a]
xs) a
x = [a] -> SnocList a
forall a. [a] -> SnocList a
SnocList (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs)

runSnocList :: SnocList a -> [a]
runSnocList :: SnocList a -> [a]
runSnocList (SnocList [a]
xs) = [a] -> [a]
forall a. [a] -> [a]
reverse [a]
xs

instance Semigroup (SnocList a) where
    SnocList [a]
xs <> :: SnocList a -> SnocList a -> SnocList a
<> SnocList [a]
ys = [a] -> SnocList a
forall a. [a] -> SnocList a
SnocList ([a]
ys [a] -> [a] -> [a]
forall a. Semigroup a => a -> a -> a
External instance of the constraint type forall a. Semigroup [a]
<> [a]
xs)

instance Monoid (SnocList a) where
    mempty :: SnocList a
mempty = [a] -> SnocList a
forall a. [a] -> SnocList a
SnocList []
    mappend :: SnocList a -> SnocList a -> SnocList a
mappend = SnocList a -> SnocList a -> SnocList a
forall a. Semigroup a => a -> a -> a
Instance of class: Semigroup of the constraint type forall a. Semigroup (SnocList a)
(<>)