module Assoc where
import OpTypes
import List(partition)
import Maybe (listToMaybe)
import Products
import EnvM
class (Prod2 p k v, Functor c) => AssocC c p k v where
-- define:
lkpAllEq :: EqOp k -> k -> EnvM (c p) [v]
splitAssoc :: (k -> Bool) -> EnvM (c p) (c p, c p)
{-
lkpDefEq :: EqOp k -> v -> k -> EnvM (c p) v
nonfailLkpEq :: EqOp k -> k -> EnvM (c p) v
lkp :: Eq k => k -> EnvM (c p) (Maybe v)
lkpDef :: Eq k => v -> k -> EnvM (c p) v
nonfailLkp :: Eq k => k -> EnvM (c p) v
keys :: EnvM (c p) (c k)
-}
lkpEq eq i = listToMaybe . lkpAllEq eq i
lkpDefEq eq v k = maybe v id . lkpEq eq k
nonfailLkpEq eq = lkpDefEq eq (error "nonfailLkp failed.")
lkpAll x = lkpAllEq (==) x
lkp x = lkpEq (==) x
lkpDef x = lkpDefEq (==) x
nonfailLkp x = nonfailLkpEq (==) x
keys x = fmap proj1 x
instance Prod2 p k v => AssocC [] p k v where
lkpAllEq eq i = map proj2 . filter (eq i . proj1)
splitAssoc p = partition (p . proj1)
type Assoc a b = [(a,b)]