module HNum.F where

import           HNum.Vector
import           HNum.CSV

-- | Functional Programming Tools for HNum Object
class Functor f => FuncTools f where
  -- | Absolute Abstraction with Scalar Function
  hflat :: ([a] -> a) -> f a -> a
  -- | Absolute Abstraction with Vector Function
  hlift :: ([a] -> [b]) -> f a -> f b
  -- | Like map
  hmap :: (a -> b) -> f a -> f b
  -- | Like filter
  hfilter :: (a -> Bool) -> f a -> f a
  -- | Like take
  htake :: Int -> f a -> f a
  -- | Like takeWhile
  htakeWhile :: (a -> Bool) -> f a -> f a
  -- | Like drop
  hdrop :: Int -> f a -> f a
  -- | Like dropWhile
  hdropWhile :: (a -> Bool) -> f a -> f a

instance FuncTools Vector where
  hflat f = f . toList
  hlift f = vec . f . toList
  hmap = hlift . map
  hfilter = hlift . filter
  htake n = hlift (take n)
  htakeWhile f = hlift (takeWhile f)
  hdrop n = hlift (drop n)
  hdropWhile f = hlift (dropWhile f)

instance FuncTools Matrix where
  hflat = undefined
  hlift f = matrix . map f . matForm
  hmap = hlift . map
  hfilter = hlift . filter
  htake n = hlift (take n)
  htakeWhile f = hlift (takeWhile f)
  hdrop n = hlift (drop n)
  hdropWhile f = hlift (dropWhile f)