{-# LANGUAGE NoImplicitPrelude, NoMonomorphismRestriction #-}

module DDF.Bimap (module DDF.Bimap, module DDF.Prod, module DDF.Option) where

import qualified DDF.Map as Map
import DDF.Prod
import DDF.Option
import DDF.Int
import qualified Data.Bimap as M
import qualified Prelude as M
import qualified Data.Map as M

class (Int r, Map.Map r) => Bimap r where
  size :: r h (M.Bimap a b -> M.Int)
  lookupL :: (Map.Ord a, Map.Ord b) => r h (M.Bimap a b -> a -> Maybe b)
  lookupR :: (Map.Ord a, Map.Ord b) => r h (M.Bimap a b -> b -> Maybe a)
  empty :: r h (M.Bimap a b)
  singleton :: r h ((a, b) -> M.Bimap a b)
  toMapL :: r h (M.Bimap a b -> M.Map a b)
  toMapR :: r h (M.Bimap a b -> M.Map b a)
  insert :: (Map.Ord a, Map.Ord b) => r h ((a, b) -> M.Bimap a b -> M.Bimap a b) 
  updateL :: (Map.Ord a, Map.Ord b) => r h ((b -> Maybe b) -> a -> M.Bimap a b -> M.Bimap a b)
  updateR :: (Map.Ord a, Map.Ord b) => r h ((a -> Maybe a) -> b -> M.Bimap a b -> M.Bimap a b)

lookupL2 = app2 lookupL
size1 = app size
insert2 = app2 insert