{-# LANGUAGE DataKinds, FlexibleInstances, LiberalTypeSynonyms #-}
{-# LANGUAGE MultiParamTypeClasses, TemplateHaskell, TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Algebra.Field.Galois.Conway
(Conway,
ConwayPolynomial(..),
addConwayPolynomials,
conwayFile) where
import Algebra.Field.Galois.Internal
import Algebra.Prelude.Core
import Control.Monad (liftM)
import Language.Haskell.TH (runIO)
import Language.Haskell.TH (DecsQ)
do dat <- tail . init . lines <$> runIO (readFile "data/conway.txt")
concat <$> mapM (buildInstance . head . parseLine) dat
-- | Macro to add Conway polynomials dictionary.
addConwayPolynomials :: [(Integer, Integer, [Integer])] -> DecsQ
addConwayPolynomials = liftM concat . mapM buildInstance
-- | Parse conway polynomial file and define instances for them.
-- File-format must be the same as
-- <http://www.math.rwth-aachen.de/~Frank.Luebeck/data/ConwayPol/index.html?LANG=en Lueback's file>.
conwayFile :: FilePath -> DecsQ
conwayFile fp = do
dat <- tail . init . lines <$> runIO (readFile fp)
addConwayPolynomials $ concatMap parseLine dat