{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE TypeFamilies #-}
module Data.List.Kleene.Plus
(
Plus(..)
,pattern (:+)
,pattern One
,Star(..)
,last
,filter
,reverse
,take
,(!!)
,unfoldr
,iterate
,cycle
,scanr
,scanl
,prescanr
,prescanl
,sortBy
,sortOn
,sort
)
where
import Data.List.Kleene.Internal
import Data.Ord
import Prelude hiding (cycle, filter, head, iterate,
last, reverse, scanl, scanr, take,
(!!))
sortBy :: (a -> a -> Ordering) -> Plus a -> Plus a
sortBy :: (a -> a -> Ordering) -> Plus a -> Plus a
sortBy cmp :: a -> a -> Ordering
cmp = (a -> Plus a) -> (Plus a -> Plus a -> Plus a) -> Plus a -> Plus a
forall a b. (a -> b) -> (b -> b -> b) -> Plus a -> b
treeFoldMap a -> Plus a
forall a. a -> Plus a
One ((a -> a -> Ordering) -> Plus a -> Plus a -> Plus a
forall a. (a -> a -> Ordering) -> Plus a -> Plus a -> Plus a
mergelr a -> a -> Ordering
cmp)
sortOn :: Ord b => (a -> b) -> Plus a -> Plus a
sortOn :: (a -> b) -> Plus a -> Plus a
sortOn c :: a -> b
c = ((a, b) -> a) -> Plus (a, b) -> Plus a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, b) -> a
forall a b. (a, b) -> a
fst (Plus (a, b) -> Plus a)
-> (Plus a -> Plus (a, b)) -> Plus a -> Plus a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Plus (a, b))
-> (Plus (a, b) -> Plus (a, b) -> Plus (a, b))
-> Plus a
-> Plus (a, b)
forall a b. (a -> b) -> (b -> b -> b) -> Plus a -> b
treeFoldMap (\x :: a
x -> (a, b) -> Plus (a, b)
forall a. a -> Plus a
One (a
x, a -> b
c a
x)) (((a, b) -> (a, b) -> Ordering)
-> Plus (a, b) -> Plus (a, b) -> Plus (a, b)
forall a. (a -> a -> Ordering) -> Plus a -> Plus a -> Plus a
mergelr (((a, b) -> b) -> (a, b) -> (a, b) -> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing (a, b) -> b
forall a b. (a, b) -> b
snd))
sort :: Ord a => Plus a -> Plus a
sort :: Plus a -> Plus a
sort = (a -> a -> Ordering) -> Plus a -> Plus a
forall a. (a -> a -> Ordering) -> Plus a -> Plus a
sortBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
last :: Plus a -> a
last :: Plus a -> a
last = (a -> a -> a) -> Plus a -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldl1 (\_ x :: a
x -> a
x)
unfoldr :: (b -> (a, Maybe b)) -> b -> Plus a
unfoldr :: (b -> (a, Maybe b)) -> b -> Plus a
unfoldr f :: b -> (a, Maybe b)
f b :: b
b = a
x a -> Star a -> Plus a
forall a. a -> Star a -> Plus a
:- Star a -> (b -> Star a) -> Maybe b -> Star a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Star a
forall a. Star a
Nil (Plus a -> Star a
forall a. Plus a -> Star a
Cons (Plus a -> Star a) -> (b -> Plus a) -> b -> Star a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (b -> (a, Maybe b)) -> b -> Plus a
forall b a. (b -> (a, Maybe b)) -> b -> Plus a
unfoldr b -> (a, Maybe b)
f) Maybe b
xs
where
(x :: a
x,xs :: Maybe b
xs) = b -> (a, Maybe b)
f b
b
cycle :: Plus a -> Plus a
cycle :: Plus a -> Plus a
cycle xs :: Plus a
xs = Plus a
ys
where
ys :: Plus a
ys = Plus a
xs Plus a -> Plus a -> Plus a
forall a. Semigroup a => a -> a -> a
<> Plus a
ys
iterate :: (a -> a) -> a -> Plus a
iterate :: (a -> a) -> a -> Plus a
iterate f :: a -> a
f x :: a
x = a
x a -> Plus a -> Plus a
forall a. a -> Plus a -> Plus a
:+ (a -> a) -> a -> Plus a
forall a. (a -> a) -> a -> Plus a
iterate a -> a
f (a -> a
f a
x)
prescanr :: (a -> b -> b) -> b -> Plus a -> Plus b
prescanr :: (a -> b -> b) -> b -> Plus a -> Plus b
prescanr f :: a -> b -> b
f b :: b
b (One x :: a
x) = b -> Plus b
forall a. a -> Plus a
One (a -> b -> b
f a
x b
b)
prescanr f :: a -> b -> b
f b :: b
b (x :: a
x :+ xs :: Plus a
xs) = a -> b -> b
f a
x (Plus b -> b
forall a. Plus a -> a
head Plus b
ys) b -> Plus b -> Plus b
forall a. a -> Plus a -> Plus a
:+ Plus b
ys
where
ys :: Plus b
ys = (a -> b -> b) -> b -> Plus a -> Plus b
forall a b. (a -> b -> b) -> b -> Plus a -> Plus b
prescanr a -> b -> b
f b
b Plus a
xs
prescanl :: (b -> a -> b) -> b -> Plus a -> Plus b
prescanl :: (b -> a -> b) -> b -> Plus a -> Plus b
prescanl = (b -> a -> b) -> b -> Plus a -> Plus b
forall b a. (b -> a -> b) -> b -> Plus a -> Plus b
prescanlPlus
reverse :: Plus a -> Plus a
reverse :: Plus a -> Plus a
reverse (x :: a
x :- xs :: Star a
xs) = (Plus a -> a -> Plus a) -> Plus a -> Star a -> Plus a
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl ((a -> Plus a -> Plus a) -> Plus a -> a -> Plus a
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> Plus a -> Plus a
forall a. a -> Plus a -> Plus a
(:+)) (a -> Plus a
forall a. a -> Plus a
One a
x) Star a
xs
take :: Int -> Plus a -> Star a
take :: Int -> Plus a -> Star a
take = Int -> Plus a -> Star a
forall a. Int -> Plus a -> Star a
takePlus
(!!) :: Plus a -> Int -> a
!! :: Plus a -> Int -> a
(!!) = Plus a -> Int -> a
forall a. Plus a -> Int -> a
indexPlus