'use strict'
var memoize = require('../lib/memoize')
var ptc = require('../lib/props-to-arr')
var INTERVAL = require('./regex')
var TYPES = 'PMMPPMM'
var QALT = {
P: { dddd: -4, ddd: -3, dd: -2, d: -1, P: 0, A: 1, AA: 2, AAA: 3, AAAA: 4 },
M: { ddd: -4, dd: -3, d: -2, m: -1, M: 0, A: 1, AA: 2, AAA: 3, AAAA: 4 }
}
/**
* Parse a [interval shorthand notation](https://en.wikipedia.org/wiki/Interval_(music)#Shorthand_notation)
* to [interval coord notation](https://github.com/danigb/music.array.notation)
*
* This function is cached for better performance.
*
* @name interval.parse
* @function
* @param {String} interval - the interval string
* @return {Array} the interval in array notation or null if not a valid interval
*
* @example
* var parse = require('music-notation/interval/parse')
* parse('3m') // => [2, -1, 0]
* parse('9b') // => [1, -1, 1]
* parse('-2M') // => [6, -1, -1]
*/
module.exports = memoize(function (str) {
var m = INTERVAL.exec(str)
if (!m) return null
var dir = (m[2] || m[7]) === '-' ? -1 : 1
var num = +(m[3] || m[8]) - 1
var q = m[4] || m[6] || ''
var simple = num % 7
var alt
if (q === '') alt = 0
else if (q[0] === '#') alt = q.length
else if (q[0] === 'b') alt = -q.length
else {
alt = QALT[TYPES[simple]][q]
if (typeof alt === 'undefined') return null
}
var oct = Math.floor(num / 7)
return ptc([simple, alt, oct, dir])
})
|