{-# LANGUAGE NoImplicitPrelude #-} module DDF.Combine where import DDF.Lang import qualified DDF.Map as Map data Combine l r h x = Combine (l h x) (r h x) instance (DBI l, DBI r) => DBI (Combine l r) where z = Combine z z s (Combine l r) = Combine (s l) (s r) app (Combine fl fr) (Combine xl xr) = Combine (app fl xl) (app fr xr) abs (Combine l r) = Combine (abs l) (abs r) hoas f = Combine (hoas $ \x -> case f (Combine x z) of Combine l _ -> l) (hoas $ \x -> case f (Combine z x) of Combine _ r -> r) instance (Bool l, Bool r) => Bool (Combine l r) where bool x = Combine (bool x) (bool x) ite = Combine ite ite instance (Char l, Char r) => Char (Combine l r) where char x = Combine (char x) (char x) instance (Prod l, Prod r) => Prod (Combine l r) where mkProd = Combine mkProd mkProd zro = Combine zro zro fst = Combine fst fst instance (Double l, Double r) => Double (Combine l r) where double x = Combine (double x) (double x) doublePlus = Combine doublePlus doublePlus doubleMinus = Combine doubleMinus doubleMinus doubleMult = Combine doubleMult doubleMult doubleDivide = Combine doubleDivide doubleDivide doubleExp = Combine doubleExp doubleExp instance (Float l, Float r) => Float (Combine l r) where float x = Combine (float x) (float x) floatPlus = Combine floatPlus floatPlus floatMinus = Combine floatMinus floatMinus floatMult = Combine floatMult floatMult floatDivide = Combine floatDivide floatDivide floatExp = Combine floatExp floatExp instance (Option l, Option r) => Option (Combine l r) where nothing = Combine nothing nothing just = Combine just just optionMatch = Combine optionMatch optionMatch instance (Map.Map l, Map.Map r) => Map.Map (Combine l r) where empty = Combine Map.empty Map.empty lookup = Combine Map.lookup Map.lookup singleton = Combine Map.singleton Map.singleton alter = Combine Map.alter Map.alter mapMap = Combine Map.mapMap Map.mapMap instance (Bimap l, Bimap r) => Bimap (Combine l r) where instance (Dual l, Dual r) => Dual (Combine l r) where dual = Combine dual dual runDual = Combine runDual runDual instance (Lang l, Lang r) => Lang (Combine l r) where fix = Combine fix fix left = Combine left left right = Combine right right sumMatch = Combine sumMatch sumMatch unit = Combine unit unit exfalso = Combine exfalso exfalso ioRet = Combine ioRet ioRet ioBind = Combine ioBind ioBind ioMap = Combine ioMap ioMap nil = Combine nil nil cons = Combine cons cons listMatch = Combine listMatch listMatch runWriter = Combine runWriter runWriter writer = Combine writer writer double2Float = Combine double2Float double2Float float2Double = Combine float2Double float2Double state = Combine state state runState = Combine runState runState putStrLn = Combine putStrLn putStrLn