packages feed

symbolize-1.0.3.0: src/Symbolize/NonEmptyWeakSymbol.hs

{-# LANGUAGE GHC2021 #-}
module Symbolize.NonEmptyWeakSymbol 
(NonEmptyWeakSymbol((:|)), 
toList, 
nonEmpty, 
singleton, 
cons
) where

import Symbolize.WeakSymbol (WeakSymbol)

-- | A monomorphised version of `Data.List.NonEmpty`
-- which allows its head `WeakSymbol` to be UNPACKed into it.
-- Since we expect collisions to be _very_ rare,
-- this skips the intermediate allocation almost always.
data NonEmptyWeakSymbol where
  (:|) :: {-# UNPACK #-} !WeakSymbol -> ![WeakSymbol] -> NonEmptyWeakSymbol

toList :: NonEmptyWeakSymbol -> [WeakSymbol]
{-# INLINE toList #-}
toList (a :| as) = a : as

nonEmpty :: [WeakSymbol] -> Maybe NonEmptyWeakSymbol
{-# INLINE nonEmpty #-}
nonEmpty [] = Nothing
nonEmpty (a : as) = Just (a :| as)

singleton :: WeakSymbol -> NonEmptyWeakSymbol
{-# INLINE singleton #-}
singleton a = a :| []

cons :: WeakSymbol -> NonEmptyWeakSymbol -> NonEmptyWeakSymbol
{-# INLINE cons #-}
cons y (x :| xs) = y :| (x : xs)