Assoc.hs

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)]





Plain-text version of Assoc.hs | Valid HTML?