{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Language.Phonetic.Encoder (Encoder (..)) where

import qualified Data.Set as Set

import           Data.ListLike (ListLike)
import qualified Data.ListLike as ListLike

import           Language.Phonetic.Internal


class Encoder enc where
    alphabet     :: Alphabet enc
    encodeUnsafe :: ListLike full Char => full -> Code enc

    encode :: ListLike full Char => full -> Maybe (Code enc)
    encode ll | ListLike.all (flip Set.member alph) ll = Just (encodeUnsafe ll)
              | otherwise                              = Nothing
      where alph = getAlphabet (alphabet :: Alphabet enc)