From 717fb83756d4ae65a3c7cea3a8974cd9aff6fe33 Mon Sep 17 00:00:00 2001 From: Alan Zimmerman Date: Sat, 20 Feb 2021 17:03:01 +0000 Subject: Introduce more OrdList functions initOL, tailOL, unsnocOL, unconsOL --- compiler/GHC/Data/OrdList.hs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/compiler/GHC/Data/OrdList.hs b/compiler/GHC/Data/OrdList.hs index 510e6f0f15..17e080eec2 100644 --- a/compiler/GHC/Data/OrdList.hs +++ b/compiler/GHC/Data/OrdList.hs @@ -17,6 +17,7 @@ module GHC.Data.OrdList ( OrdList, pattern NilOL, pattern ConsOL, pattern SnocOL, nilOL, isNilOL, unitOL, appOL, consOL, snocOL, concatOL, lastOL, headOL, + initOL, tailOL, unsnocOL, unconsOL, mapOL, fromOL, toOL, foldrOL, foldlOL, reverseOL, fromOLReverse, strictlyEqOL, strictlyOrdOL ) where @@ -75,6 +76,10 @@ concatOL :: [OrdList a] -> OrdList a headOL :: OrdList a -> a lastOL :: OrdList a -> a lengthOL :: OrdList a -> Int +initOL :: OrdList a -> OrdList a +tailOL :: OrdList a -> OrdList a +unsnocOL :: OrdList a -> (OrdList a, a) +unconsOL :: OrdList a -> (a, OrdList a) nilOL = None unitOL as = One as @@ -140,6 +145,36 @@ lastOL (Cons _ as) = lastOL as lastOL (Snoc _ a) = a lastOL (Two _ as) = lastOL as +initOL None = panic "initOL" +initOL (One _) = None +initOL (Many [_]) = None +initOL (Many as) = Many (init as) +initOL (Cons a (Many [_])) = One a +initOL (Cons a (One _)) = One a +initOL (Cons a as) = Cons a (initOL as) +initOL (Snoc as _) = as +initOL (Two as (Many [_])) = as +initOL (Two as (One _)) = as +initOL (Two as bs) = Two as (initOL bs) + +tailOL None = panic "initOL" +tailOL (One _) = None +tailOL (Many [_]) = None +tailOL (Many as) = Many (tail as) +tailOL (Cons _ as) = as +tailOL (Snoc (Many [_]) b) = One b +tailOL (Snoc (One _) b) = One b +tailOL (Snoc as b) = Snoc (tailOL as) b +tailOL (Two (Many [_]) bs) = bs +tailOL (Two (One _) bs) = bs +tailOL (Two as bs) = Two (tailOL as) bs + +unconsOL None = panic "unconsOL" +unconsOL as = (headOL as, tailOL as) + +unsnocOL None = panic "unsnocOL" +unsnocOL as = (initOL as, lastOL as) + lengthOL None = 0 lengthOL (One _) = 1 lengthOL (Many as) = length as -- cgit v1.2.1