{-# LANGUAGE OverloadedStrings #-}

module Funcons.Core.Values.Composite.MapsBuiltin where

import Control.Applicative ((<$>))

import Funcons.EDSL hiding (map_)
import Funcons.MSOS (rewrittens)
import Funcons.Core.Values.Primitive.BoolBuiltin
import Funcons.Core.Values.Composite.SetsBuiltin

import qualified Funcons.Operations as VAL

import qualified Data.Set as S
import qualified Data.Map as M

import Data.Foldable (foldrM)

library = libFromList [
    ("map-empty", fromNullaryValOp map_empty_ VAL.map_empty_)
  , ("is-map-empty", fromValOp is_map_empty_ VAL.is_map_empty_)
  , ("map-insert", fromValOp map_insert_ VAL.map_insert_)
  , ("map-lookup", fromSeqValOp map_lookup_ VAL.map_lookup_)
  , ("lookup", fromSeqValOp map_lookup_ VAL.map_lookup_)
  , ("map-domain", fromValOp map_domain_ VAL.domain_)
  , ("domain", fromValOp map_domain_ VAL.domain_)
  , ("dom", fromValOp map_domain_ VAL.domain_)
  , ("map-delete", fromValOp map_delete_ VAL.map_delete_)
  , ("is-in-domain", fromValOp is_in_domain_ VAL.is_in_domain_)
  , ("map-unite", fromValOp map_unite_ VAL.map_unite_)
  , ("map-override", fromValOp map_override_ VAL.map_override_)
  , ("maps", fromValOp maps_ VAL.maps_)
  , ("map", fromValOp map_ VAL.map_)
  , ("map-elements", fromSeqValOp map_elements_ VAL.map_elements_)
  ]

map_ = applyFuncon "map"
maps_ = applyFuncon "maps"
map_empty_ = applyFuncon "map-empty"
is_map_empty_ = applyFuncon "is-map-empty"
is_in_domain_ = applyFuncon "is-in-domain"
map_insert_ = applyFuncon "map-insert"
map_delete_ = applyFuncon "map-delete"
-- |
-- Computes the union over a sequence of maps.
-- If the maps do not have disjoint domains a failure signal is raised.
map_unite_ = FApp "map-unite"
lookup_ = applyFuncon "lookup"
map_lookup_ = applyFuncon "lookup"
map_override_ = applyFuncon "map-override"
domain_ = applyFuncon "domain"
dom_ = applyFuncon "domain"
map_domain_ = applyFuncon "domain"
map_elements_ = applyFuncon "map-elements"