--
-- Expresso additional List operations
--
let
{..} = import "Prelude.x";
reverse
: forall a. [a] -> [a]
= foldl (xs x -> x :: xs) [];
tails
: forall a. [a] -> [[a]]
= fix (r xs ->
case uncons xs of
{ Nothing{} -> [[]]
, Just{tail=xs'} -> xs :: r xs'
});
intersperse
: forall a. a -> [a] -> [a]
= sep xs ->
let f = x xs -> (if null xs then [x] else x :: sep :: xs)
in foldr f [] xs;
intercalate
: forall a. [a] -> [[a]] -> [a]
= xs xss -> concat (intersperse xs xss);
dropWhile
: forall a. (a -> Bool) -> [a] -> [a]
= p -> xs -> foldr (x r b ->
if b && p x then r True else x::r False) (const []) xs True;
dropWhileEnd
: forall a. (a -> Bool) -> [a] -> [a]
= p -> foldr (x xs -> if null xs && p x then [] else x :: xs) [];
takeWhile
: forall a. (a -> Bool) -> [a] -> [a]
= p -> foldr (x xs -> if p x then x :: xs else []) [];
takeWhileEnd
: forall a. (a -> Bool) -> [a] -> [a]
= p -> reverse << takeWhile p << reverse;
isPrefixOf
: forall a. Eq a => [a] -> [a] -> Bool
= fix (r xs ys ->
case uncons xs of
{ Nothing{} -> True
, Just {head=x, tail=xs'} ->
case uncons ys of
{ Nothing{} -> False
, Just {head=y, tail=ys'} ->
x==y && r xs' ys'
}
});
isSuffixOf
: forall a. Eq a => [a] -> [a] -> Bool
= xs ys -> isPrefixOf (reverse xs) (reverse ys);
stripPrefix
: forall a. Eq a => [a] -> [a] -> Maybe [a]
= fix (r xs ys ->
case uncons xs of
{ Nothing{} -> Just ys
, Just{head=x,tail=xs'} ->
case uncons ys of
{ Nothing{} -> Nothing{}
, Just {head=y, tail=ys'} ->
if x==y then r xs' ys' else Nothing{}
}
});
stripSuffix
: forall a. Eq a => [a] -> [a] -> Maybe [a]
= xs ys -> stripPrefix (reverse xs) (reverse ys);
dropPrefix
: forall a. Eq a => [a] -> [a] -> [a]
= xs ys -> fromMaybe ys (stripPrefix xs ys);
dropSuffix
: forall a. Eq a => [a] -> [a] -> [a]
= xs ys -> fromMaybe ys (stripSuffix xs ys);
zipWith
: forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
= f -> fix (r xs ys ->
case uncons xs of
{ Nothing{} -> []
, Just{head=x,tail=xs'} ->
case uncons ys of
{ Nothing{} -> []
, Just {head=y, tail=ys'} ->
f x y :: r xs' ys'
}
});
zip : forall a b. [a] -> [b] -> [{l:a, r:b}]
= zipWith (a b -> { l = a, r = b });
replace
: forall a. Eq a => [a] -> [a] -> [a] -> [a]
= fix (r from to xs ->
if null from then xs
else case stripPrefix from xs of
{ Just xs' -> to ++ r from to xs'
, Nothing{} -> case uncons xs of
{ Nothing{} -> []
, Just{head=x, tail=xs'} ->
x :: r from to xs'
}})
-- Prelude re-exports
in { foldr
, null
, map
, filter
, length
, foldl
, concat
-- Exports
, reverse
, tails
, intersperse
, intercalate
, dropWhile
, dropWhileEnd
, takeWhile
, takeWhileEnd
, isPrefixOf
, isSuffixOf
, stripPrefix
, stripSuffix
, dropPrefix
, dropSuffix
, zipWith
, zip
, replace
}