------------------------------------------------------------------------
-- INCREMENTAL λ-CALCULUS
--
-- Incrementalization as term-to-term transformation with the Nehemiah plugin.
------------------------------------------------------------------------

module Nehemiah.Change.Derive where

open import Nehemiah.Syntax.Type
open import Nehemiah.Syntax.Term
open import Nehemiah.Change.Type
open import Nehemiah.Change.Term

open import Data.Integer

import Parametric.Change.Derive Const ΔBase as Derive

deriveConst : Derive.Structure
deriveConst (intlit-const n) ∅ ∅ = intlit (+ 0)
deriveConst add-const        (s • t • ∅) (ds • dt • ∅) = add ds dt
deriveConst minus-const      (t • ∅) (dt • ∅) = minus dt
deriveConst empty-const      ∅ ∅ = empty
deriveConst insert-const     (s • t • ∅) (ds • dt • ∅) = insert (s ⊕₍ int ₎ ds) (t ⊕₍ bag ₎ dt) ⊝ insert s t
deriveConst union-const      (s • t • ∅) (ds • dt • ∅) = union ds dt
deriveConst negate-const     (t • ∅) (dt • ∅) = negate dt
deriveConst flatmap-const    (s • t • ∅) (ds • dt • ∅) = flatmap (s ⊕₍ int ⇒ bag ₎ ds) (t ⊕₍ bag ₎ dt) ⊝ flatmap s t
deriveConst sum-const        (t • ∅) (dt • ∅) = sum dt

open Derive.Structure deriveConst public