module Generics.BiGUL.Lib where

import Generics.BiGUL
import Generics.BiGUL.TH


skip :: Eq v => v -> BiGUL s v
skip v = Skip (const v)

(==>) :: (a -> b) -> a -> b
(==>) = ($)

infixr 0 ==>

emb :: Eq v => (s -> v) -> (s -> v -> s) -> BiGUL s v
emb g p = Case
  [ $(normal [| \s v -> g s == v |] [p| _ |])
    ==> Skip g
  , $(adaptive [| \s v -> {- g s /= v -} True |])
    ==> p
  ]