{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ViewPatterns #-}
module PlutusTx.Data.List (
List,
caseList,
caseList',
null,
append,
find,
findIndices,
filter,
mapMaybe,
any,
all,
foldMap,
map,
length,
mconcat,
(<|),
cons,
nil,
singleton,
uncons,
and,
or,
elem,
notElem,
foldr,
foldl,
concat,
concatMap,
listToMaybe,
uniqueElement,
(!!),
revAppend,
reverse,
replicate,
findIndex,
unzip,
zipWith,
head,
last,
tail,
take,
drop,
dropWhile,
splitAt,
elemBy,
nubBy,
nub,
partition,
toBuiltinList,
fromBuiltinList,
toSOP,
fromSOP,
) where
import PlutusTx.Builtins qualified as B
import PlutusTx.Builtins.Internal (BuiltinList)
import PlutusTx.Builtins.Internal qualified as BI
import PlutusTx.IsData.Class (FromData (..), ToData (..), UnsafeFromData (..))
import PlutusTx.Lift (makeLift)
import PlutusTx.Prelude (Bool (..), BuiltinData, Eq (..), Integer, Maybe (..), Monoid (..),
Ord (..), Semigroup (..), fmap, not, pure, traceError, ($), (&&), (.),
(<$>), (||))
import Prettyprinter (Pretty (..))
import Data.Coerce (coerce)
import Data.Semigroup qualified as Haskell
import PlutusTx.ErrorCodes (indexTooLargeError, lastEmptyListError, negativeIndexError)
import Prelude qualified as Haskell
newtype List a = List (BuiltinList BuiltinData)
deriving stock (Int -> List a -> ShowS
[List a] -> ShowS
List a -> String
(Int -> List a -> ShowS)
-> (List a -> String) -> ([List a] -> ShowS) -> Show (List a)
forall a. Int -> List a -> ShowS
forall a. [List a] -> ShowS
forall a. List a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Int -> List a -> ShowS
showsPrec :: Int -> List a -> ShowS
$cshow :: forall a. List a -> String
show :: List a -> String
$cshowList :: forall a. [List a] -> ShowS
showList :: [List a] -> ShowS
Haskell.Show, List a -> List a -> Bool
(List a -> List a -> Bool)
-> (List a -> List a -> Bool) -> Eq (List a)
forall a. List a -> List a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. List a -> List a -> Bool
== :: List a -> List a -> Bool
$c/= :: forall a. List a -> List a -> Bool
/= :: List a -> List a -> Bool
Haskell.Eq)
instance Eq (List a) where
{-# INLINEABLE (==) #-}
List BuiltinList BuiltinData
l == :: List a -> List a -> Bool
== List BuiltinList BuiltinData
l' = BuiltinData -> BuiltinData -> Bool
B.equalsData (BuiltinList BuiltinData -> BuiltinData
BI.mkList BuiltinList BuiltinData
l) (BuiltinList BuiltinData -> BuiltinData
BI.mkList BuiltinList BuiltinData
l')
instance ToData (List a) where
{-# INLINEABLE toBuiltinData #-}
toBuiltinData :: List a -> BuiltinData
toBuiltinData (List BuiltinList BuiltinData
l) = BuiltinList BuiltinData -> BuiltinData
BI.mkList BuiltinList BuiltinData
l
instance FromData (List a) where
{-# INLINEABLE fromBuiltinData #-}
fromBuiltinData :: BuiltinData -> Maybe (List a)
fromBuiltinData = List a -> Maybe (List a)
forall a. a -> Maybe a
Just (List a -> Maybe (List a))
-> (BuiltinData -> List a) -> BuiltinData -> Maybe (List a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinList BuiltinData -> List a
forall a. BuiltinList BuiltinData -> List a
List (BuiltinList BuiltinData -> List a)
-> (BuiltinData -> BuiltinList BuiltinData)
-> BuiltinData
-> List a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinData -> BuiltinList BuiltinData
BI.unsafeDataAsList
instance UnsafeFromData (List a) where
{-# INLINEABLE unsafeFromBuiltinData #-}
unsafeFromBuiltinData :: BuiltinData -> List a
unsafeFromBuiltinData = BuiltinList BuiltinData -> List a
forall a. BuiltinList BuiltinData -> List a
List (BuiltinList BuiltinData -> List a)
-> (BuiltinData -> BuiltinList BuiltinData)
-> BuiltinData
-> List a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinData -> BuiltinList BuiltinData
BI.unsafeDataAsList
instance (UnsafeFromData a, Pretty a) => Pretty (List a) where
{-# INLINEABLE pretty #-}
pretty :: forall ann. List a -> Doc ann
pretty = [a] -> Doc ann
forall ann. [a] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty ([a] -> Doc ann) -> (List a -> [a]) -> List a -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. List a -> [a]
forall a. UnsafeFromData a => List a -> [a]
toSOP
instance Semigroup (List a) where
<> :: List a -> List a -> List a
(<>) = List a -> List a -> List a
forall a. List a -> List a -> List a
append
{-# INLINEABLE (<>) #-}
instance Monoid (List a) where
mempty :: List a
mempty = List a
forall a. List a
nil
{-# INLINEABLE mempty #-}
instance Haskell.Semigroup (List a) where
<> :: List a -> List a -> List a
(<>) = List a -> List a -> List a
forall a. List a -> List a -> List a
append
{-# INLINEABLE (<>) #-}
instance Haskell.Monoid (List a) where
mempty :: List a
mempty = List a
forall a. List a
nil
{-# INLINEABLE mempty #-}
caseList
:: forall a r
. (UnsafeFromData a)
=> (() -> r)
-> (a -> List a -> r)
-> List a
-> r
caseList :: forall a r.
UnsafeFromData a =>
(() -> r) -> (a -> List a -> r) -> List a -> r
caseList () -> r
n ~a -> List a -> r
c (List BuiltinList BuiltinData
l) = (() -> r)
-> (BuiltinData -> BuiltinList BuiltinData -> r)
-> BuiltinList BuiltinData
-> r
forall a r.
(() -> r) -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList () -> r
n (\BuiltinData
x -> a -> List a -> r
c (BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
x) (List a -> r)
-> (BuiltinList BuiltinData -> List a)
-> BuiltinList BuiltinData
-> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinList BuiltinData -> List a
forall a. BuiltinList BuiltinData -> List a
List) BuiltinList BuiltinData
l
{-# INLINEABLE caseList #-}
caseList'
:: forall a r
. (UnsafeFromData a)
=>
r
-> (a -> List a -> r)
-> List a
-> r
caseList' :: forall a r.
UnsafeFromData a =>
r -> (a -> List a -> r) -> List a -> r
caseList' r
n ~a -> List a -> r
c (List BuiltinList BuiltinData
l) = r
-> (BuiltinData -> BuiltinList BuiltinData -> r)
-> BuiltinList BuiltinData
-> r
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList' r
n (\BuiltinData
x -> a -> List a -> r
c (BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
x) (List a -> r)
-> (BuiltinList BuiltinData -> List a)
-> BuiltinList BuiltinData
-> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinList BuiltinData -> List a
forall a. BuiltinList BuiltinData -> List a
List) BuiltinList BuiltinData
l
{-# INLINEABLE caseList' #-}
null :: List a -> Bool
null :: forall a. List a -> Bool
null = BuiltinList BuiltinData -> Bool
forall a. BuiltinList a -> Bool
B.null (BuiltinList BuiltinData -> Bool)
-> (List a -> BuiltinList BuiltinData) -> List a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @_ @(BuiltinList BuiltinData)
{-# INLINEABLE null #-}
infixr 5 <|
(<|) :: (ToData a) => a -> List a -> List a
<| :: forall a. ToData a => a -> List a -> List a
(<|) a
h = BuiltinList BuiltinData -> List a
forall a b. Coercible a b => a -> b
coerce (BuiltinList BuiltinData -> List a)
-> (List a -> BuiltinList BuiltinData) -> List a -> List a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. a -> BuiltinList a -> BuiltinList a
BI.mkCons (a -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData a
h) (BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> (List a -> BuiltinList BuiltinData)
-> List a
-> BuiltinList BuiltinData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. List a -> BuiltinList BuiltinData
forall a b. Coercible a b => a -> b
coerce
{-# INLINEABLE (<|) #-}
cons :: (ToData a) => a -> List a -> List a
cons :: forall a. ToData a => a -> List a -> List a
cons = a -> List a -> List a
forall a. ToData a => a -> List a -> List a
(<|)
{-# INLINEABLE cons #-}
nil :: List a
nil :: forall a. List a
nil = BuiltinList BuiltinData -> List a
forall a. BuiltinList BuiltinData -> List a
List BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil
{-# INLINEABLE nil #-}
singleton :: (ToData a) => a -> List a
singleton :: forall a. ToData a => a -> List a
singleton a
a = a -> List a -> List a
forall a. ToData a => a -> List a -> List a
cons a
a List a
forall a. List a
nil
{-# INLINEABLE singleton #-}
append :: List a -> List a -> List a
append :: forall a. List a -> List a -> List a
append (List BuiltinList BuiltinData
l) (List BuiltinList BuiltinData
l') = BuiltinList BuiltinData -> List a
forall a. BuiltinList BuiltinData -> List a
List (BuiltinList BuiltinData -> BuiltinList BuiltinData
go BuiltinList BuiltinData
l)
where
go :: BuiltinList BuiltinData -> BuiltinList BuiltinData
go =
BuiltinList BuiltinData
-> (BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> BuiltinList BuiltinData
-> BuiltinList BuiltinData
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
BuiltinList BuiltinData
l'
(\BuiltinData
h BuiltinList BuiltinData
t -> BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. a -> BuiltinList a -> BuiltinList a
BI.mkCons BuiltinData
h (BuiltinList BuiltinData -> BuiltinList BuiltinData
go BuiltinList BuiltinData
t))
{-# INLINEABLE append #-}
find :: (UnsafeFromData a) => (a -> Bool) -> List a -> Maybe a
find :: forall a. UnsafeFromData a => (a -> Bool) -> List a -> Maybe a
find a -> Bool
pred' = List a -> Maybe a
go
where
go :: List a -> Maybe a
go =
Maybe a -> (a -> List a -> Maybe a) -> List a -> Maybe a
forall a r.
UnsafeFromData a =>
r -> (a -> List a -> r) -> List a -> r
caseList'
Maybe a
forall a. Maybe a
Nothing
(\a
h List a
t ->
if a -> Bool
pred' a
h
then a -> Maybe a
forall a. a -> Maybe a
Just a
h
else List a -> Maybe a
go List a
t
)
{-# INLINEABLE find #-}
findIndices :: (UnsafeFromData a) => (a -> Bool) -> List a -> List Integer
findIndices :: forall a. UnsafeFromData a => (a -> Bool) -> List a -> List Integer
findIndices a -> Bool
pred' = Integer -> List a -> List Integer
go Integer
0
where
go :: Integer -> List a -> List Integer
go Integer
i =
List Integer
-> (a -> List a -> List Integer) -> List a -> List Integer
forall a r.
UnsafeFromData a =>
r -> (a -> List a -> r) -> List a -> r
caseList'
List Integer
forall a. Monoid a => a
mempty
(\a
h List a
t ->
let indices :: List Integer
indices = Integer -> List a -> List Integer
go (Integer -> Integer -> Integer
B.addInteger Integer
1 Integer
i) List a
t
in if a -> Bool
pred' a
h
then Integer
i Integer -> List Integer -> List Integer
forall a. ToData a => a -> List a -> List a
<| List Integer
indices
else List Integer
indices
)
{-# INLINEABLE findIndices #-}
filter :: (UnsafeFromData a, ToData a) => (a -> Bool) -> List a -> List a
filter :: forall a.
(UnsafeFromData a, ToData a) =>
(a -> Bool) -> List a -> List a
filter a -> Bool
pred1 = List a -> List a
go
where
go :: List a -> List a
go =
List a -> (a -> List a -> List a) -> List a -> List a
forall a r.
UnsafeFromData a =>
r -> (a -> List a -> r) -> List a -> r
caseList'
List a
forall a. Monoid a => a
mempty
(\a
h List a
t ->
if a -> Bool
pred1 a
h then a
h a -> List a -> List a
forall a. ToData a => a -> List a -> List a
<| List a -> List a
go List a
t else List a -> List a
go List a
t
)
{-# INLINEABLE filter #-}
mapMaybe :: (UnsafeFromData a, ToData b) => (a -> Maybe b) -> List a -> List b
mapMaybe :: forall a b.
(UnsafeFromData a, ToData b) =>
(a -> Maybe b) -> List a -> List b
mapMaybe a -> Maybe b
f = List a -> List b
go
where
go :: List a -> List b
go =
List b -> (a -> List a -> List b) -> List a -> List b
forall a r.
UnsafeFromData a =>
r -> (a -> List a -> r) -> List a -> r
caseList'
List b
forall a. Monoid a => a
mempty
(\a
h List a
t ->
case a -> Maybe b
f a
h of
Just b
b -> b
b b -> List b -> List b
forall a. ToData a => a -> List a -> List a
<| List a -> List b
go List a
t
Maybe b
Nothing -> List a -> List b
go List a
t
)
{-# INLINEABLE mapMaybe #-}
any :: (UnsafeFromData a) => (a -> Bool) -> List a -> Bool
any :: forall a. UnsafeFromData a => (a -> Bool) -> List a -> Bool
any a -> Bool
pred1 = List a -> Bool
go
where
go :: List a -> Bool
go =
Bool -> (a -> List a -> Bool) -> List a -> Bool
forall a r.
UnsafeFromData a =>
r -> (a -> List a -> r) -> List a -> r
caseList'
Bool
False
(\a
h List a
t -> a -> Bool
pred1 a
h Bool -> Bool -> Bool
|| List a -> Bool
go List a
t)
{-# INLINEABLE any #-}
all :: (UnsafeFromData a) => (a -> Bool) -> List a -> Bool
all :: forall a. UnsafeFromData a => (a -> Bool) -> List a -> Bool
all a -> Bool
pred1 = List a -> Bool
go
where
go :: List a -> Bool
go =
Bool -> (a -> List a -> Bool) -> List a -> Bool
forall a r.
UnsafeFromData a =>
r -> (a -> List a -> r) -> List a -> r
caseList'
Bool
True
(\a
h List a
t -> a -> Bool
pred1 a
h Bool -> Bool -> Bool
&& List a -> Bool
go List a
t)
{-# INLINEABLE all #-}
foldMap :: (UnsafeFromData a, Monoid m) => (a -> m) -> List a -> m
foldMap :: forall a m. (UnsafeFromData a, Monoid m) => (a -> m) -> List a -> m
foldMap a -> m
f = List a -> m
go
where
go :: List a -> m
go =
m -> (a -> List a -> m) -> List a -> m
forall a r.
UnsafeFromData a =>
r -> (a -> List a -> r) -> List a -> r
caseList'
m
forall a. Monoid a => a
mempty
(\a
h List a
t -> a -> m
f a
h m -> m -> m
forall a. Semigroup a => a -> a -> a
<> List a -> m
go List a
t)
{-# INLINEABLE foldMap #-}
map :: (UnsafeFromData a, ToData b) => (a -> b) -> List a -> List b
map :: forall a b.
(UnsafeFromData a, ToData b) =>
(a -> b) -> List a -> List b
map a -> b
f = (List a -> BuiltinList BuiltinData) -> List a -> List b
forall a b. Coercible a b => a -> b
coerce List a -> BuiltinList BuiltinData
go
where
go :: List a -> BuiltinList BuiltinData
go =
BuiltinList BuiltinData
-> (a -> List a -> BuiltinList BuiltinData)
-> List a
-> BuiltinList BuiltinData
forall a r.
UnsafeFromData a =>
r -> (a -> List a -> r) -> List a -> r
caseList'
BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil
(\a
h List a
t ->
BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. a -> BuiltinList a -> BuiltinList a
BI.mkCons
(b -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData (b -> BuiltinData) -> b -> BuiltinData
forall a b. (a -> b) -> a -> b
$ a -> b
f a
h)
(List a -> BuiltinList BuiltinData
go List a
t)
)
{-# INLINEABLE map #-}
length :: List a -> Integer
length :: forall a. List a -> Integer
length (List BuiltinList BuiltinData
l) = BuiltinList BuiltinData -> Integer
forall {a}. BuiltinList a -> Integer
go BuiltinList BuiltinData
l
where
go :: BuiltinList a -> Integer
go = Integer
-> (a -> BuiltinList a -> Integer) -> BuiltinList a -> Integer
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
BI.caseList' Integer
0 (\a
_ -> Integer -> Integer -> Integer
B.addInteger Integer
1 (Integer -> Integer)
-> (BuiltinList a -> Integer) -> BuiltinList a -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinList a -> Integer
go)
{-# INLINEABLE length #-}
mconcat :: (Monoid a, UnsafeFromData a) => List a -> a
mconcat :: forall a. (Monoid a, UnsafeFromData a) => List a -> a
mconcat = List a -> a
go
where
go :: List a -> a
go =
a -> (a -> List a -> a) -> List a -> a
forall a r.
UnsafeFromData a =>
r -> (a -> List a -> r) -> List a -> r
caseList'
a
forall a. Monoid a => a
mempty
(\a
h List a
t -> a
h a -> a -> a
forall a. Semigroup a => a -> a -> a
<> List a -> a
go List a
t)
{-# INLINABLE mconcat #-}
uncons :: (UnsafeFromData a) => List a -> Maybe (a, List a)
uncons :: forall a. UnsafeFromData a => List a -> Maybe (a, List a)
uncons (List BuiltinList BuiltinData
l) = do
(BuiltinData
h, BuiltinList BuiltinData
t) <- BuiltinList BuiltinData
-> Maybe (BuiltinData, BuiltinList BuiltinData)
forall a. BuiltinList a -> Maybe (a, BuiltinList a)
B.uncons BuiltinList BuiltinData
l
(a, List a) -> Maybe (a, List a)
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h, BuiltinList BuiltinData -> List a
forall a. BuiltinList BuiltinData -> List a
List BuiltinList BuiltinData
t)
{-# INLINEABLE uncons #-}
and :: List Bool -> Bool
and :: List Bool -> Bool
and = List Bool -> Bool
go
where
go :: List Bool -> Bool
go =
Bool -> (Bool -> List Bool -> Bool) -> List Bool -> Bool
forall a r.
UnsafeFromData a =>
r -> (a -> List a -> r) -> List a -> r
caseList'
Bool
True
(\Bool
h List Bool
t -> Bool
h Bool -> Bool -> Bool
&& List Bool -> Bool
go List Bool
t)
{-# INLINEABLE and #-}
or :: List Bool -> Bool
or :: List Bool -> Bool
or = List Bool -> Bool
go (List Bool -> Bool)
-> (List Bool -> List Bool) -> List Bool -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. List Bool -> List Bool
forall a b. Coercible a b => a -> b
coerce
where
go :: List Bool -> Bool
go =
Bool -> (Bool -> List Bool -> Bool) -> List Bool -> Bool
forall a r.
UnsafeFromData a =>
r -> (a -> List a -> r) -> List a -> r
caseList'
Bool
False
(\Bool
h List Bool
t -> Bool
h Bool -> Bool -> Bool
|| List Bool -> Bool
go List Bool
t)
{-# INLINEABLE or #-}
elem :: (ToData a) => a -> List a -> Bool
elem :: forall a. ToData a => a -> List a -> Bool
elem a
x = BuiltinList BuiltinData -> Bool
go (BuiltinList BuiltinData -> Bool)
-> (List a -> BuiltinList BuiltinData) -> List a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. List a -> BuiltinList BuiltinData
forall a b. Coercible a b => a -> b
coerce
where
go :: BuiltinList BuiltinData -> Bool
go =
let x' :: BuiltinData
x' = a -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData a
x
in Bool
-> (BuiltinData -> BuiltinList BuiltinData -> Bool)
-> BuiltinList BuiltinData
-> Bool
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
Bool
False
(\BuiltinData
h BuiltinList BuiltinData
t -> BuiltinData
x' BuiltinData -> BuiltinData -> Bool
forall a. Eq a => a -> a -> Bool
== BuiltinData
h Bool -> Bool -> Bool
|| BuiltinList BuiltinData -> Bool
go BuiltinList BuiltinData
t)
{-# INLINEABLE elem #-}
notElem :: (ToData a) => a -> List a -> Bool
notElem :: forall a. ToData a => a -> List a -> Bool
notElem a
x = Bool -> Bool
not (Bool -> Bool) -> (List a -> Bool) -> List a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> List a -> Bool
forall a. ToData a => a -> List a -> Bool
elem a
x
{-# INLINEABLE notElem #-}
foldr :: (UnsafeFromData a) => (a -> b -> b) -> b -> List a -> b
foldr :: forall a b. UnsafeFromData a => (a -> b -> b) -> b -> List a -> b
foldr a -> b -> b
f b
z = b -> BuiltinList BuiltinData -> b
go b
z (BuiltinList BuiltinData -> b)
-> (List a -> BuiltinList BuiltinData) -> List a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. List a -> BuiltinList BuiltinData
forall a b. Coercible a b => a -> b
coerce
where
go :: b -> BuiltinList BuiltinData -> b
go b
u =
b
-> (BuiltinData -> BuiltinList BuiltinData -> b)
-> BuiltinList BuiltinData
-> b
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
b
u
(\BuiltinData
h -> a -> b -> b
f (BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h) (b -> b)
-> (BuiltinList BuiltinData -> b) -> BuiltinList BuiltinData -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> BuiltinList BuiltinData -> b
go b
u)
{-# INLINEABLE foldr #-}
foldl :: (UnsafeFromData a) => (b -> a -> b) -> b -> List a -> b
foldl :: forall a b. UnsafeFromData a => (b -> a -> b) -> b -> List a -> b
foldl b -> a -> b
f b
z = b -> BuiltinList BuiltinData -> b
go b
z (BuiltinList BuiltinData -> b)
-> (List a -> BuiltinList BuiltinData) -> List a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. List a -> BuiltinList BuiltinData
forall a b. Coercible a b => a -> b
coerce
where
go :: b -> BuiltinList BuiltinData -> b
go b
acc =
b
-> (BuiltinData -> BuiltinList BuiltinData -> b)
-> BuiltinList BuiltinData
-> b
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
b
acc
(\BuiltinData
h BuiltinList BuiltinData
t ->
let h' :: a
h' = BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h
in b -> BuiltinList BuiltinData -> b
go (b -> a -> b
f b
acc a
h') BuiltinList BuiltinData
t
)
{-# INLINEABLE foldl #-}
concat :: List (List a) -> List a
concat :: forall a. List (List a) -> List a
concat = (List a -> List a -> List a) -> List a -> List (List a) -> List a
forall a b. UnsafeFromData a => (a -> b -> b) -> b -> List a -> b
foldr List a -> List a -> List a
forall a. List a -> List a -> List a
append List a
forall a. Monoid a => a
mempty
{-# INLINEABLE concat #-}
concatMap :: (UnsafeFromData a) => (a -> List b) -> List a -> List b
concatMap :: forall a b. UnsafeFromData a => (a -> List b) -> List a -> List b
concatMap = (a -> List b) -> List a -> List b
forall a m. (UnsafeFromData a, Monoid m) => (a -> m) -> List a -> m
foldMap
{-# INLINEABLE concatMap #-}
listToMaybe :: (UnsafeFromData a) => List a -> Maybe a
listToMaybe :: forall a. UnsafeFromData a => List a -> Maybe a
listToMaybe (List BuiltinList BuiltinData
l) = BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (BuiltinData -> a) -> Maybe BuiltinData -> Maybe a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BuiltinList BuiltinData -> Maybe BuiltinData
forall a. BuiltinList a -> Maybe a
B.headMaybe BuiltinList BuiltinData
l
{-# INLINEABLE listToMaybe #-}
uniqueElement :: (UnsafeFromData a) => List a -> Maybe a
uniqueElement :: forall a. UnsafeFromData a => List a -> Maybe a
uniqueElement (List BuiltinList BuiltinData
l) = do
(BuiltinData
h, BuiltinList BuiltinData
t) <- BuiltinList BuiltinData
-> Maybe (BuiltinData, BuiltinList BuiltinData)
forall a. BuiltinList a -> Maybe (a, BuiltinList a)
B.uncons BuiltinList BuiltinData
l
if BuiltinList BuiltinData -> Bool
forall a. BuiltinList a -> Bool
B.null BuiltinList BuiltinData
t
then a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> a -> Maybe a
forall a b. (a -> b) -> a -> b
$ BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h
else Maybe a
forall a. Maybe a
Nothing
{-# INLINEABLE uniqueElement #-}
infixl 9 !!
(!!) :: (UnsafeFromData a) => List a -> Integer -> a
(List BuiltinList BuiltinData
l) !! :: forall a. UnsafeFromData a => List a -> Integer -> a
!! Integer
n =
if Integer -> Integer -> Bool
B.lessThanInteger Integer
n Integer
0
then BuiltinString -> a
forall a. BuiltinString -> a
traceError BuiltinString
negativeIndexError
else Integer -> BuiltinList BuiltinData -> a
forall {r}.
UnsafeFromData r =>
Integer -> BuiltinList BuiltinData -> r
go Integer
n BuiltinList BuiltinData
l
where
go :: Integer -> BuiltinList BuiltinData -> r
go Integer
n' =
(() -> r)
-> (BuiltinData -> BuiltinList BuiltinData -> r)
-> BuiltinList BuiltinData
-> r
forall a r.
(() -> r) -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList
(\() -> BuiltinString -> r
forall a. BuiltinString -> a
traceError BuiltinString
indexTooLargeError)
(\BuiltinData
h BuiltinList BuiltinData
t ->
if Integer -> Integer -> Bool
B.equalsInteger Integer
n' Integer
0
then BuiltinData -> r
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h
else Integer -> BuiltinList BuiltinData -> r
go (Integer -> Integer -> Integer
B.subtractInteger Integer
n' Integer
1) BuiltinList BuiltinData
t
)
{-# INLINABLE (!!) #-}
revAppend :: List a -> List a -> List a
revAppend :: forall a. List a -> List a -> List a
revAppend (List BuiltinList BuiltinData
l) (List BuiltinList BuiltinData
l') = BuiltinList BuiltinData -> List a
forall a. BuiltinList BuiltinData -> List a
List (BuiltinList BuiltinData -> List a)
-> BuiltinList BuiltinData -> List a
forall a b. (a -> b) -> a -> b
$ BuiltinList BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall {a}. BuiltinList a -> BuiltinList a -> BuiltinList a
rev BuiltinList BuiltinData
l BuiltinList BuiltinData
l'
where
rev :: BuiltinList a -> BuiltinList a -> BuiltinList a
rev BuiltinList a
l1 BuiltinList a
l2 =
BuiltinList a
-> (a -> BuiltinList a -> BuiltinList a)
-> BuiltinList a
-> BuiltinList a
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
BuiltinList a
l2
(\a
h BuiltinList a
t -> BuiltinList a -> BuiltinList a -> BuiltinList a
rev BuiltinList a
t (a -> BuiltinList a -> BuiltinList a
forall a. a -> BuiltinList a -> BuiltinList a
BI.mkCons a
h BuiltinList a
l2))
BuiltinList a
l1
{-# INLINEABLE revAppend #-}
reverse :: List a -> List a
reverse :: forall a. List a -> List a
reverse List a
l = List a -> List a -> List a
forall a. List a -> List a -> List a
revAppend List a
l List a
forall a. Monoid a => a
mempty
{-# INLINEABLE reverse #-}
replicate :: (ToData a) => Integer -> a -> List a
replicate :: forall a. ToData a => Integer -> a -> List a
replicate Integer
n (a -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData -> BuiltinData
x) = BuiltinList BuiltinData -> List a
forall a b. Coercible a b => a -> b
coerce (BuiltinList BuiltinData -> List a)
-> BuiltinList BuiltinData -> List a
forall a b. (a -> b) -> a -> b
$ Integer -> BuiltinList BuiltinData
go Integer
n
where
go :: Integer -> BuiltinList BuiltinData
go Integer
n' =
if Integer -> Integer -> Bool
B.equalsInteger Integer
n' Integer
0
then BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil
else BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. a -> BuiltinList a -> BuiltinList a
BI.mkCons BuiltinData
x (Integer -> BuiltinList BuiltinData
go (Integer -> Integer -> Integer
B.subtractInteger Integer
n' Integer
1))
{-# INLINEABLE replicate #-}
findIndex :: (UnsafeFromData a) => (a -> Bool) -> List a -> Maybe Integer
findIndex :: forall a.
UnsafeFromData a =>
(a -> Bool) -> List a -> Maybe Integer
findIndex a -> Bool
pred' = Integer -> BuiltinList BuiltinData -> Maybe Integer
go Integer
0 (BuiltinList BuiltinData -> Maybe Integer)
-> (List a -> BuiltinList BuiltinData) -> List a -> Maybe Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. List a -> BuiltinList BuiltinData
forall a b. Coercible a b => a -> b
coerce
where
go :: Integer -> BuiltinList BuiltinData -> Maybe Integer
go Integer
i =
Maybe Integer
-> (BuiltinData -> BuiltinList BuiltinData -> Maybe Integer)
-> BuiltinList BuiltinData
-> Maybe Integer
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
Maybe Integer
forall a. Maybe a
Nothing
(\BuiltinData
h BuiltinList BuiltinData
t ->
if a -> Bool
pred' (BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h) then Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
i else Integer -> BuiltinList BuiltinData -> Maybe Integer
go (Integer -> Integer -> Integer
B.addInteger Integer
1 Integer
i) BuiltinList BuiltinData
t
)
{-# INLINEABLE findIndex #-}
unzip :: forall a b . List (a, b) -> (List a, List b)
unzip :: forall a b. List (a, b) -> (List a, List b)
unzip =
(BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData))
-> List (a, b) -> (List a, List b)
forall a b. Coercible a b => a -> b
coerce BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
go
where
go :: BuiltinList BuiltinData -> (BuiltinList BuiltinData, BuiltinList BuiltinData)
go :: BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
go =
(BuiltinList BuiltinData, BuiltinList BuiltinData)
-> (BuiltinData
-> BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData))
-> BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
(BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil, BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil)
(\BuiltinData
h BuiltinList BuiltinData
t ->
let (BuiltinData
a, BuiltinData
b) = BuiltinData -> (BuiltinData, BuiltinData)
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h
(BuiltinList BuiltinData
as, BuiltinList BuiltinData
bs) = BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
go BuiltinList BuiltinData
t
in (BuiltinData
a BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. a -> BuiltinList a -> BuiltinList a
`BI.mkCons` BuiltinList BuiltinData
as, BuiltinData
b BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. a -> BuiltinList a -> BuiltinList a
`BI.mkCons` BuiltinList BuiltinData
bs)
)
{-# INLINEABLE unzip #-}
zipWith
:: (UnsafeFromData a, UnsafeFromData b, ToData c)
=> (a -> b -> c) -> List a -> List b -> List c
zipWith :: forall a b c.
(UnsafeFromData a, UnsafeFromData b, ToData c) =>
(a -> b -> c) -> List a -> List b -> List c
zipWith a -> b -> c
f = (BuiltinList BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> List a -> List b -> List c
forall a b. Coercible a b => a -> b
coerce BuiltinList BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData
go
where
go :: BuiltinList BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
go :: BuiltinList BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData
go BuiltinList BuiltinData
l1' BuiltinList BuiltinData
l2' =
BuiltinList BuiltinData
-> (BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> BuiltinList BuiltinData
-> BuiltinList BuiltinData
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil
(\BuiltinData
h1 BuiltinList BuiltinData
t1 ->
BuiltinList BuiltinData
-> (BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> BuiltinList BuiltinData
-> BuiltinList BuiltinData
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil
(\BuiltinData
h2 BuiltinList BuiltinData
t2 ->
BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. a -> BuiltinList a -> BuiltinList a
BI.mkCons
(c -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData
(c -> BuiltinData) -> c -> BuiltinData
forall a b. (a -> b) -> a -> b
$ a -> b -> c
f
(BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h1)
(BuiltinData -> b
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h2)
)
(BuiltinList BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData
go BuiltinList BuiltinData
t1 BuiltinList BuiltinData
t2)
)
BuiltinList BuiltinData
l2'
)
BuiltinList BuiltinData
l1'
{-# INLINEABLE zipWith #-}
head :: forall a . (UnsafeFromData a) => List a -> a
head :: forall a. UnsafeFromData a => List a -> a
head =
forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce
@(BuiltinList BuiltinData -> a)
@(List a -> a)
(BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (BuiltinData -> a)
-> (BuiltinList BuiltinData -> BuiltinData)
-> BuiltinList BuiltinData
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinList BuiltinData -> BuiltinData
forall a. BuiltinList a -> a
B.head)
{-# INLINEABLE head #-}
last :: forall a . (UnsafeFromData a) => List a -> a
last :: forall a. UnsafeFromData a => List a -> a
last =
forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce
@(BuiltinList BuiltinData -> a)
@(List a -> a)
(BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (BuiltinData -> a)
-> (BuiltinList BuiltinData -> BuiltinData)
-> BuiltinList BuiltinData
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinList BuiltinData -> BuiltinData
go)
where
go :: BuiltinList BuiltinData -> BuiltinData
go :: BuiltinList BuiltinData -> BuiltinData
go =
(() -> BuiltinData)
-> (BuiltinData -> BuiltinList BuiltinData -> BuiltinData)
-> BuiltinList BuiltinData
-> BuiltinData
forall a r.
(() -> r) -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList
(\() -> BuiltinString -> BuiltinData
forall a. BuiltinString -> a
traceError BuiltinString
lastEmptyListError)
(\BuiltinData
h BuiltinList BuiltinData
t ->
if BuiltinList BuiltinData -> Bool
forall a. BuiltinList a -> Bool
B.null BuiltinList BuiltinData
t
then BuiltinData
h
else BuiltinList BuiltinData -> BuiltinData
go BuiltinList BuiltinData
t
)
{-# INLINEABLE last #-}
tail :: forall a . List a -> List a
tail :: forall a. List a -> List a
tail = forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @(BuiltinList BuiltinData) @(List a) (BuiltinList BuiltinData -> List a)
-> (List a -> BuiltinList BuiltinData) -> List a -> List a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. BuiltinList a -> BuiltinList a
B.tail (BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> (List a -> BuiltinList BuiltinData)
-> List a
-> BuiltinList BuiltinData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. List a -> BuiltinList BuiltinData
forall a b. Coercible a b => a -> b
coerce
{-# INLINEABLE tail #-}
take :: forall a . Integer -> List a -> List a
take :: forall a. Integer -> List a -> List a
take Integer
n = (BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> List a -> List a
forall a b. Coercible a b => a -> b
coerce ((BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> List a -> List a)
-> (BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> List a
-> List a
forall a b. (a -> b) -> a -> b
$ Integer -> BuiltinList BuiltinData -> BuiltinList BuiltinData
go Integer
n
where
go :: Integer -> BuiltinList BuiltinData -> BuiltinList BuiltinData
go :: Integer -> BuiltinList BuiltinData -> BuiltinList BuiltinData
go Integer
n' =
BuiltinList BuiltinData
-> (BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> BuiltinList BuiltinData
-> BuiltinList BuiltinData
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil
(\BuiltinData
h BuiltinList BuiltinData
t ->
if Integer -> Integer -> Bool
B.equalsInteger Integer
n' Integer
0
then BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil
else BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. a -> BuiltinList a -> BuiltinList a
BI.mkCons BuiltinData
h (Integer -> BuiltinList BuiltinData -> BuiltinList BuiltinData
go (Integer -> Integer -> Integer
B.subtractInteger Integer
n' Integer
1) BuiltinList BuiltinData
t)
)
{-# INLINEABLE take #-}
drop :: forall a . Integer -> List a -> List a
drop :: forall a. Integer -> List a -> List a
drop Integer
n = (BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> List a -> List a
forall a b. Coercible a b => a -> b
coerce ((BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> List a -> List a)
-> (BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> List a
-> List a
forall a b. (a -> b) -> a -> b
$ Integer -> BuiltinList BuiltinData -> BuiltinList BuiltinData
go Integer
n
where
go :: Integer -> BuiltinList BuiltinData -> BuiltinList BuiltinData
go :: Integer -> BuiltinList BuiltinData -> BuiltinList BuiltinData
go Integer
n' BuiltinList BuiltinData
xs =
if Integer
n' Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
<= Integer
0
then BuiltinList BuiltinData
xs
else
BuiltinList BuiltinData
-> (BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> BuiltinList BuiltinData
-> BuiltinList BuiltinData
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil
(\BuiltinData
_ -> Integer -> BuiltinList BuiltinData -> BuiltinList BuiltinData
go (Integer -> Integer -> Integer
B.subtractInteger Integer
n' Integer
1))
BuiltinList BuiltinData
xs
{-# INLINEABLE drop #-}
dropWhile :: forall a . (UnsafeFromData a) => (a -> Bool) -> List a -> List a
dropWhile :: forall a. UnsafeFromData a => (a -> Bool) -> List a -> List a
dropWhile a -> Bool
pred1 =
forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @_ @(List a -> List a) ((BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> List a -> List a)
-> (BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> List a
-> List a
forall a b. (a -> b) -> a -> b
$ BuiltinList BuiltinData -> BuiltinList BuiltinData
go
where
go :: BuiltinList BuiltinData -> BuiltinList BuiltinData
go :: BuiltinList BuiltinData -> BuiltinList BuiltinData
go BuiltinList BuiltinData
xs =
BuiltinList BuiltinData
-> (BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> BuiltinList BuiltinData
-> BuiltinList BuiltinData
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil
(\BuiltinData
h BuiltinList BuiltinData
t ->
if a -> Bool
pred1 (BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h) then BuiltinList BuiltinData -> BuiltinList BuiltinData
go BuiltinList BuiltinData
t else BuiltinList BuiltinData
xs
)
BuiltinList BuiltinData
xs
{-# INLINEABLE dropWhile #-}
splitAt :: forall a . Integer -> List a -> (List a, List a)
splitAt :: forall a. Integer -> List a -> (List a, List a)
splitAt Integer
n List a
l =
(BuiltinList BuiltinData, BuiltinList BuiltinData)
-> (List a, List a)
forall a b. Coercible a b => a -> b
coerce ((BuiltinList BuiltinData, BuiltinList BuiltinData)
-> (List a, List a))
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
-> (List a, List a)
forall a b. (a -> b) -> a -> b
$ Integer
-> BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
go Integer
n (forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @_ @(BuiltinList BuiltinData) List a
l)
where
go :: Integer
-> BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
go Integer
n' BuiltinList BuiltinData
xs =
if Integer
n' Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
<= Integer
0
then (BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil, BuiltinList BuiltinData
xs)
else
(BuiltinList BuiltinData, BuiltinList BuiltinData)
-> (BuiltinData
-> BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData))
-> BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
(BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil, BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil)
(\BuiltinData
h BuiltinList BuiltinData
t ->
if Integer -> Integer -> Bool
B.equalsInteger Integer
n' Integer
0
then (BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil, forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @_ @(BuiltinList BuiltinData) List a
l)
else
let (BuiltinList BuiltinData
l1, BuiltinList BuiltinData
l2) = Integer
-> BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
go (Integer -> Integer -> Integer
B.subtractInteger Integer
n' Integer
1) BuiltinList BuiltinData
t
in (BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. a -> BuiltinList a -> BuiltinList a
BI.mkCons BuiltinData
h BuiltinList BuiltinData
l1, BuiltinList BuiltinData
l2)
)
BuiltinList BuiltinData
xs
{-# INLINEABLE splitAt #-}
elemBy :: (UnsafeFromData a) => (a -> a -> Bool) -> a -> List a -> Bool
elemBy :: forall a.
UnsafeFromData a =>
(a -> a -> Bool) -> a -> List a -> Bool
elemBy a -> a -> Bool
pred2 a
x = BuiltinList BuiltinData -> Bool
go (BuiltinList BuiltinData -> Bool)
-> (List a -> BuiltinList BuiltinData) -> List a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. List a -> BuiltinList BuiltinData
forall a b. Coercible a b => a -> b
coerce
where
go :: BuiltinList BuiltinData -> Bool
go =
Bool
-> (BuiltinData -> BuiltinList BuiltinData -> Bool)
-> BuiltinList BuiltinData
-> Bool
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
Bool
False
(\BuiltinData
h BuiltinList BuiltinData
t -> a -> a -> Bool
pred2 (BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h) a
x Bool -> Bool -> Bool
|| BuiltinList BuiltinData -> Bool
go BuiltinList BuiltinData
t)
{-# INLINEABLE elemBy #-}
nubBy :: forall a . (UnsafeFromData a) => (a -> a -> Bool) -> List a -> List a
nubBy :: forall a. UnsafeFromData a => (a -> a -> Bool) -> List a -> List a
nubBy a -> a -> Bool
pred2 List a
l =
forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @_ @(List a) (BuiltinList BuiltinData -> List a)
-> BuiltinList BuiltinData -> List a
forall a b. (a -> b) -> a -> b
$ BuiltinList BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData
go (forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @_ @(BuiltinList BuiltinData) List a
l) BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil
where
go :: BuiltinList BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData
go BuiltinList BuiltinData
ys BuiltinList BuiltinData
xs =
BuiltinList BuiltinData
-> (BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData)
-> BuiltinList BuiltinData
-> BuiltinList BuiltinData
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil
(\BuiltinData
h BuiltinList BuiltinData
t ->
if (a -> a -> Bool) -> a -> List a -> Bool
forall a.
UnsafeFromData a =>
(a -> a -> Bool) -> a -> List a -> Bool
elemBy a -> a -> Bool
pred2 (BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h) (BuiltinList BuiltinData -> List a
forall a b. Coercible a b => a -> b
coerce BuiltinList BuiltinData
xs)
then BuiltinList BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData
go BuiltinList BuiltinData
t BuiltinList BuiltinData
xs
else BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. a -> BuiltinList a -> BuiltinList a
BI.mkCons BuiltinData
h (BuiltinList BuiltinData
-> BuiltinList BuiltinData -> BuiltinList BuiltinData
go BuiltinList BuiltinData
t (BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. a -> BuiltinList a -> BuiltinList a
BI.mkCons BuiltinData
h BuiltinList BuiltinData
xs))
)
BuiltinList BuiltinData
ys
{-# INLINEABLE nubBy #-}
nub :: (Eq a, UnsafeFromData a) => List a -> List a
nub :: forall a. (Eq a, UnsafeFromData a) => List a -> List a
nub = (a -> a -> Bool) -> List a -> List a
forall a. UnsafeFromData a => (a -> a -> Bool) -> List a -> List a
nubBy a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==)
{-# INLINEABLE nub #-}
partition :: (UnsafeFromData a) => (a -> Bool) -> List a -> (List a, List a)
partition :: forall a.
UnsafeFromData a =>
(a -> Bool) -> List a -> (List a, List a)
partition a -> Bool
pred1 List a
l =
(BuiltinList BuiltinData, BuiltinList BuiltinData)
-> (List a, List a)
forall a b. Coercible a b => a -> b
coerce ((BuiltinList BuiltinData, BuiltinList BuiltinData)
-> (List a, List a))
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
-> (List a, List a)
forall a b. (a -> b) -> a -> b
$ BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
go (List a -> BuiltinList BuiltinData
forall a b. Coercible a b => a -> b
coerce List a
l)
where
go :: BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
go =
(BuiltinList BuiltinData, BuiltinList BuiltinData)
-> (BuiltinData
-> BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData))
-> BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList'
(BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil, BuiltinList BuiltinData
forall arep. MkNil arep => BuiltinList arep
B.mkNil)
(\BuiltinData
h BuiltinList BuiltinData
t ->
let h' :: a
h' = BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h
(BuiltinList BuiltinData
l1, BuiltinList BuiltinData
l2) = BuiltinList BuiltinData
-> (BuiltinList BuiltinData, BuiltinList BuiltinData)
go BuiltinList BuiltinData
t
in if a -> Bool
pred1 a
h'
then (BuiltinData
h BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. a -> BuiltinList a -> BuiltinList a
`BI.mkCons` BuiltinList BuiltinData
l1, BuiltinList BuiltinData
l2)
else (BuiltinList BuiltinData
l1, BuiltinData
h BuiltinData -> BuiltinList BuiltinData -> BuiltinList BuiltinData
forall a. a -> BuiltinList a -> BuiltinList a
`BI.mkCons` BuiltinList BuiltinData
l2)
)
{-# INLINEABLE partition #-}
toBuiltinList :: List a -> BuiltinList BuiltinData
toBuiltinList :: forall a. List a -> BuiltinList BuiltinData
toBuiltinList = List a -> BuiltinList BuiltinData
forall a b. Coercible a b => a -> b
coerce
{-# INLINEABLE toBuiltinList #-}
fromBuiltinList :: BuiltinList BuiltinData -> List a
fromBuiltinList :: forall a. BuiltinList BuiltinData -> List a
fromBuiltinList = BuiltinList BuiltinData -> List a
forall a b. Coercible a b => a -> b
coerce
{-# INLINEABLE fromBuiltinList #-}
toSOP :: forall a. (UnsafeFromData a) => List a -> [a]
toSOP :: forall a. UnsafeFromData a => List a -> [a]
toSOP = (BuiltinList BuiltinData -> [a]) -> List a -> [a]
forall a b. Coercible a b => a -> b
coerce BuiltinList BuiltinData -> [a]
go
where
go :: BuiltinList BuiltinData -> [a]
go :: BuiltinList BuiltinData -> [a]
go = [a]
-> (BuiltinData -> BuiltinList BuiltinData -> [a])
-> BuiltinList BuiltinData
-> [a]
forall a r. r -> (a -> BuiltinList a -> r) -> BuiltinList a -> r
B.caseList' [] (\BuiltinData
h BuiltinList BuiltinData
t -> BuiltinData -> a
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData BuiltinData
h a -> [a] -> [a]
forall a. a -> [a] -> [a]
: BuiltinList BuiltinData -> [a]
go BuiltinList BuiltinData
t)
{-# INLINEABLE toSOP #-}
fromSOP :: forall a. (ToData a) => [a] -> List a
fromSOP :: forall a. ToData a => [a] -> List a
fromSOP = BuiltinList BuiltinData -> List a
forall a b. Coercible a b => a -> b
coerce (BuiltinList BuiltinData -> List a)
-> ([a] -> BuiltinList BuiltinData) -> [a] -> List a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinData -> BuiltinList BuiltinData
BI.unsafeDataAsList (BuiltinData -> BuiltinList BuiltinData)
-> ([a] -> BuiltinData) -> [a] -> BuiltinList BuiltinData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [BuiltinData] -> BuiltinData
B.mkList ([BuiltinData] -> BuiltinData)
-> ([a] -> [BuiltinData]) -> [a] -> BuiltinData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> BuiltinData) -> [a] -> [BuiltinData]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData
{-# INLINEABLE fromSOP #-}
makeLift ''List