-- | Ronald C. Read. \"Every one a winner or how to avoid isomorphism
-- search when cataloguing combinatorial configurations.\" /Annals of
-- Discrete Mathematics/ 2:107–20, 1978.
module Music.Theory.Z12.Read_1978 where

import Data.Bits
import Music.Theory.Z12
import Music.Theory.Z12.SRO

-- | Encoder for 'encode_prime'.
--
-- > encode [0,1,3,6,8,9] == 843
encode :: [Z12] -> Integer
encode = sum . map ((2 ^) . (fromZ12::Z12->Integer))

-- | Decoder for 'encode_prime'.
--
-- > decode 843 == [0,1,3,6,8,9]
decode :: Integer -> [Z12]
decode n =
    let f i = (i, testBit n i)
    in map (toZ12 . fst) (filter snd (map f [0..11]))

-- | Binary encoding prime form algorithm, equalivalent to Rahn.
--
-- > encode_prime [0,1,3,6,8,9] == rahn_prime [0,1,3,6,8,9]
encode_prime :: [Z12] -> [Z12]
encode_prime s =
    let t = map (`tn` s) [0..11]
        c = t ++ map (invert 0) t
    in decode (minimum (map encode c))