module Data.AssocList.List.Predicate
(
lookupFirst
, lookupAll
, removeFirst
, removeAll
, mapFirst
, mapAll
, partition
, break
, breakPartition
) where
import Data.AssocList.List.Concept
import qualified Data.List
import Data.Maybe (maybeToList)
import Prelude (Maybe (..), (++), (<$>), otherwise)
import Data.Functor.Contravariant (Predicate (..))
lookupFirst :: Predicate a -> AssocList a b -> Maybe b
lookupFirst :: Predicate a -> AssocList a b -> Maybe b
lookupFirst Predicate a
_key [] = Maybe b
forall a. Maybe a
Nothing
lookupFirst Predicate a
key ((a
x, b
y) : AssocList a b
xys)
| Predicate a -> a -> Bool
forall a. Predicate a -> a -> Bool
getPredicate Predicate a
key a
x = b -> Maybe b
forall a. a -> Maybe a
Just b
y
| Bool
otherwise = Predicate a -> AssocList a b -> Maybe b
forall a b. Predicate a -> AssocList a b -> Maybe b
lookupFirst Predicate a
key AssocList a b
xys
lookupAll :: Predicate a -> AssocList a b -> [b]
lookupAll :: Predicate a -> AssocList a b -> [b]
lookupAll Predicate a
_key [] = []
lookupAll Predicate a
key ((a
x, b
y) : AssocList a b
xys)
| Predicate a -> a -> Bool
forall a. Predicate a -> a -> Bool
getPredicate Predicate a
key a
x = b
y b -> [b] -> [b]
forall a. a -> [a] -> [a]
: Predicate a -> AssocList a b -> [b]
forall a b. Predicate a -> AssocList a b -> [b]
lookupAll Predicate a
key AssocList a b
xys
| Bool
otherwise = Predicate a -> AssocList a b -> [b]
forall a b. Predicate a -> AssocList a b -> [b]
lookupAll Predicate a
key AssocList a b
xys
removeFirst :: Predicate a -> AssocList a b -> AssocList a b
removeFirst :: Predicate a -> AssocList a b -> AssocList a b
removeFirst Predicate a
_key l :: AssocList a b
l@[] = AssocList a b
l
removeFirst Predicate a
key (xy :: (a, b)
xy@(a
x, b
y) : AssocList a b
xys)
| Predicate a -> a -> Bool
forall a. Predicate a -> a -> Bool
getPredicate Predicate a
key a
x = AssocList a b
xys
| Bool
otherwise = (a, b)
xy (a, b) -> AssocList a b -> AssocList a b
forall a. a -> [a] -> [a]
: Predicate a -> AssocList a b -> AssocList a b
forall a b. Predicate a -> AssocList a b -> AssocList a b
removeFirst Predicate a
key AssocList a b
xys
removeAll :: Predicate a -> AssocList a b -> AssocList a b
removeAll :: Predicate a -> AssocList a b -> AssocList a b
removeAll Predicate a
_key l :: AssocList a b
l@[] = AssocList a b
l
removeAll Predicate a
key (xy :: (a, b)
xy@(a
x, b
y) : AssocList a b
xys)
| Predicate a -> a -> Bool
forall a. Predicate a -> a -> Bool
getPredicate Predicate a
key a
x = Predicate a -> AssocList a b -> AssocList a b
forall a b. Predicate a -> AssocList a b -> AssocList a b
removeAll Predicate a
key AssocList a b
xys
| Bool
otherwise = (a, b)
xy (a, b) -> AssocList a b -> AssocList a b
forall a. a -> [a] -> [a]
: Predicate a -> AssocList a b -> AssocList a b
forall a b. Predicate a -> AssocList a b -> AssocList a b
removeAll Predicate a
key AssocList a b
xys
partition :: Predicate a -> AssocList a b -> ([b], AssocList a b)
partition :: Predicate a -> AssocList a b -> ([b], AssocList a b)
partition Predicate a
_key l :: AssocList a b
l@[] = ([], AssocList a b
l)
partition Predicate a
key (xy :: (a, b)
xy@(a
x, b
y) : AssocList a b
xys)
| Predicate a -> a -> Bool
forall a. Predicate a -> a -> Bool
getPredicate Predicate a
key a
x = (b
y b -> [b] -> [b]
forall a. a -> [a] -> [a]
: [b]
yes , AssocList a b
no)
| Bool
otherwise = ( [b]
yes , (a, b)
xy (a, b) -> AssocList a b -> AssocList a b
forall a. a -> [a] -> [a]
: AssocList a b
no)
where
([b]
yes, AssocList a b
no) = Predicate a -> AssocList a b -> ([b], AssocList a b)
forall a b. Predicate a -> AssocList a b -> ([b], AssocList a b)
partition Predicate a
key AssocList a b
xys
break :: Predicate a -> AssocList a b -> (AssocList a b, AssocList a b)
break :: Predicate a -> AssocList a b -> (AssocList a b, AssocList a b)
break Predicate a
key = ((a, b) -> Bool) -> AssocList a b -> (AssocList a b, AssocList a b)
forall a. (a -> Bool) -> [a] -> ([a], [a])
Data.List.break (\(a
x, b
y) -> Predicate a -> a -> Bool
forall a. Predicate a -> a -> Bool
getPredicate Predicate a
key a
x)
breakPartition :: Predicate a -> AssocList a b
-> (AssocList a b, [b], AssocList a b)
breakPartition :: Predicate a -> AssocList a b -> (AssocList a b, [b], AssocList a b)
breakPartition Predicate a
key AssocList a b
l =
let
(AssocList a b
before, AssocList a b
l') = Predicate a -> AssocList a b -> (AssocList a b, AssocList a b)
forall a b.
Predicate a -> AssocList a b -> (AssocList a b, AssocList a b)
break Predicate a
key AssocList a b
l
([b]
xs, AssocList a b
after) = Predicate a -> AssocList a b -> ([b], AssocList a b)
forall a b. Predicate a -> AssocList a b -> ([b], AssocList a b)
partition Predicate a
key AssocList a b
l'
in
(AssocList a b
before, [b]
xs, AssocList a b
after)
mapFirst :: Predicate a -> (b -> b) -> AssocList a b -> AssocList a b
mapFirst :: Predicate a -> (b -> b) -> AssocList a b -> AssocList a b
mapFirst Predicate a
key b -> b
f AssocList a b
l =
let
(AssocList a b
before, AssocList a b
l') = Predicate a -> AssocList a b -> (AssocList a b, AssocList a b)
forall a b.
Predicate a -> AssocList a b -> (AssocList a b, AssocList a b)
break Predicate a
key AssocList a b
l
in
AssocList a b
before AssocList a b -> AssocList a b -> AssocList a b
forall a. [a] -> [a] -> [a]
++
case AssocList a b
l' of
[] -> AssocList a b
l'
(a
x, b
y) : AssocList a b
after -> (a
x, b -> b
f b
y) (a, b) -> AssocList a b -> AssocList a b
forall a. a -> [a] -> [a]
: AssocList a b
after
mapAll :: Predicate a -> (b -> b) -> AssocList a b -> AssocList a b
mapAll :: Predicate a -> (b -> b) -> AssocList a b -> AssocList a b
mapAll Predicate a
key b -> b
f =
((a, b) -> (a, b)) -> AssocList a b -> AssocList a b
forall a b. (a -> b) -> [a] -> [b]
Data.List.map (a, b) -> (a, b)
g
where
g :: (a, b) -> (a, b)
g xy :: (a, b)
xy@(a
x, b
y)
| Predicate a -> a -> Bool
forall a. Predicate a -> a -> Bool
getPredicate Predicate a
key a
x = (a
x, b -> b
f b
y)
| Bool
otherwise = (a, b)
xy