{-# LANGUAGE CPP #-}
module LLVM.IRBuilder.Internal.SnocList where

import LLVM.Prelude

newtype SnocList a = SnocList { SnocList a -> [a]
unSnocList :: [a] }
  deriving (SnocList a -> SnocList a -> Bool
(SnocList a -> SnocList a -> Bool)
-> (SnocList a -> SnocList a -> Bool) -> Eq (SnocList a)
forall a. Eq a => SnocList a -> SnocList a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SnocList a -> SnocList a -> Bool
$c/= :: forall a. Eq a => SnocList a -> SnocList a -> Bool
== :: SnocList a -> SnocList a -> Bool
$c== :: forall a. Eq a => SnocList a -> SnocList a -> Bool
Eq, Int -> SnocList a -> ShowS
[SnocList a] -> ShowS
SnocList a -> String
(Int -> SnocList a -> ShowS)
-> (SnocList a -> String)
-> ([SnocList a] -> ShowS)
-> Show (SnocList a)
forall a. Show a => Int -> SnocList a -> ShowS
forall a. Show a => [SnocList a] -> ShowS
forall a. Show a => SnocList a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SnocList a] -> ShowS
$cshowList :: forall a. Show a => [SnocList a] -> ShowS
show :: SnocList a -> String
$cshow :: forall a. Show a => SnocList a -> String
showsPrec :: Int -> SnocList a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> SnocList a -> ShowS
Show)

instance Semigroup (SnocList a) where
  SnocList xs :: [a]
xs <> :: SnocList a -> SnocList a -> SnocList a
<> SnocList ys :: [a]
ys = [a] -> SnocList a
forall a. [a] -> SnocList a
SnocList ([a] -> SnocList a) -> [a] -> SnocList a
forall a b. (a -> b) -> a -> b
$ [a]
ys [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
xs

instance Monoid (SnocList a) where
#if !(MIN_VERSION_base(4,11,0))
  mappend = (<>)
#endif
  mempty :: SnocList a
mempty = [a] -> SnocList a
forall a. [a] -> SnocList a
SnocList []

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

getSnocList :: SnocList a -> [a]
getSnocList :: SnocList a -> [a]
getSnocList = [a] -> [a]
forall a. [a] -> [a]
reverse ([a] -> [a]) -> (SnocList a -> [a]) -> SnocList a -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SnocList a -> [a]
forall a. SnocList a -> [a]
unSnocList