{-# LANGUAGE NoImplicitPrelude, TypeFamilies, MultiParamTypeClasses, FlexibleInstances #-}

module DDF.Size where

import DDF.Lang
import qualified Prelude as M
import qualified DDF.Map as Map
import qualified DDF.VectorTF as VTF

newtype Size h x = Size {runSize :: M.Int}

one = Size 1

instance DBI Size where
  z = one
  s (Size x) = Size x
  app (Size l) (Size r) = Size (l + r)
  abs (Size x) = Size x

instance Bool Size where
  bool _ = one
  ite = one

instance Char Size where
  char _ = one

instance Option Size where
  nothing = one
  just = one
  optionMatch = one

instance Double Size where
  double _ = one
  doublePlus = one
  doubleMinus = one
  doubleMult = one
  doubleDivide = one
  doubleExp = one
  doubleEq = one

instance Float Size where
  float _ = one
  floatPlus = one
  floatMinus = one
  floatMult = one
  floatDivide = one
  floatExp = one

instance Map.Map Size where
  mapMap = one
  alter = one
  empty = one
  singleton = one
  lookup = one
  unionWith = one

instance Prod Size where
  mkProd = one
  zro = one
  fst = one

instance Dual Size where
  dual = one
  runDual = one

instance Bimap Size where
  updateL = one
  updateR = one
  singleton = one
  empty = one
  insert = one
  lookupL = one
  lookupR = one
  size = one
  toMapL = one
  toMapR = one

instance Unit Size where
  unit = one

instance Sum Size where
  left = one
  right = one
  sumMatch = one

instance Int Size where
  int _ = one
  pred = one
  isZero = one

instance IO Size where
  putStrLn = one

instance Y Size where
  y = one

instance List Size where
  nil = one
  cons = one
  listMatch = one

instance Functor Size x where
  map = one

instance Applicative Size x where
  pure = one
  ap = one

instance Monad Size x where
  bind = one
  join = one

instance VTF.VectorTF Size where
  zero = one
  basis = one
  plus = one
  mult = one
  vtfMatch = one

instance DiffWrapper Size where
  diffWrapper = one
  runDiffWrapper = one

instance Fix Size where
  fix = one
  runFix = one

instance FreeVector Size where
  freeVector = one
  runFreeVector = one

instance Lang Size where
  exfalso = one
  writer = one
  runWriter = one
  float2Double = one
  double2Float = one
  state = one
  runState = one