packages feed

egison-2.3.0: lib/poker-hands.egi

(define $Suit
  (type
    {[,$suit []
      {[$tgt (if (eq? tgt suit)
                 {[]}
                 {})]}]
     [<spade> []
      {[<spade> {[]}]
       [_ {}]}]
     [<heart> []
      {[<heart> {[]}]
       [_ {}]}]
     [<club> []
      {[<club> {[]}]
       [_ {}]}]
     [<diamond> []
      {[<diamond> {[]}]
       [_ {}]}]
     [_ [Something]
      {[$tgt {tgt}]}]
     }))

(define $Mod
  (lambda [$m]
    (type
      {[$var-match (lambda [$tgt] {(mod tgt m)})]
       [$inductive-match
        (destructor
          {[,$n []
            {[$tgt (if (= tgt n)
                       {[]}
                       {})]}]})]
       [$= (lambda [$val $tgt] (eq-n? (mod val m) (mod tgt m)))]})))

(define $Card
  (type
    {[,$card []
      {[$tgt (match [val tgt] [Card Card]
               {[[<card $s $n> <card ,s ,n>] {[]}]
                [[_ _] {}]})]}]
     [<card _ _> [Suit (Mod 13)]
      {[<card $s $n> {[s n]}]}]
     [_ [Something]
      {[$tgt {tgt}]}]
     }))

(define $poker-hands
  (lambda [$Cs]
    (match Cs (Multiset Card)
      {[<cons <card $S $n>
         <cons <card ,S ,(- n 1)>
          <cons <card ,S ,(- n 2)>
           <cons <card ,S ,(- n 3)>
            <cons <card ,S ,(- n 4)>
             !<nil>>>>>>
        <straight-flush>]
       [<cons <card _ $n>
         <cons <card _ ,n>
          !<cons <card _ ,n>
            !<cons <card _ ,n>
              !<cons _
                !<nil>>>>>>
        <four-of-kind>]
       [<cons <card _ $m>
         <cons <card _ ,m>
          <cons <card _ ,m>
           <cons <card _ $n>
            !<cons <card _ ,n>
              !<nil>>>>>>
        <full-house>]
       [<cons <card $S _>
         !<cons <card ,S _>
           !<cons <card ,S _>
             !<cons <card ,S _>
               !<cons <card ,S _>
                 !<nil>>>>>>
        <flush>]
       [<cons <card _ $n>
         <cons <card _ ,(- n 1)>
          <cons <card _ ,(- n 2)>
           <cons <card _ ,(- n 3)>
            <cons <card _ ,(- n 4)>
             !<nil>>>>>>
        <straight>]
       [<cons <card _ $n>
         <cons <card _ ,n>
          <cons <card _ ,n>
           <cons _
            <cons _
             !<nil>>>>>>
        <three-of-kind>]
       [<cons <card _ $m>
         <cons <card _ ,m>
          !<cons <card _ $n>
            <cons <card _ ,n>
             !<cons _
               !<nil>>>>>>
        <two-pair>]
       [<cons <card _ $n>
         <cons <card _ ,n>
          <cons _
           <cons _
            <cons _
             !<nil>>>>>>
        <one-pair>]
       [<cons _
         <cons _
          <cons _
           <cons _
            <cons _
             !<nil>>>>>>
        <nothing>]})))